形式
Plain text
投稿日時
2015-01-29 03:51
公開期間
無期限
  1. /*
  2. * Copyright (c) Daisuke OKAJIMA All rights reserved.
  3. *
  4. * $Id$
  5. */
  6. using System;
  7. using System.Diagnostics;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Collections;
  11. using System.Windows.Forms;
  12. using System.Threading;
  13. using Travis.Storage;
  14. using Zanetti.Data;
  15. using Zanetti.Config;
  16. using Zanetti.Arithmetic;
  17. using Zanetti.Parser;
  18. using Zanetti.Prediction;
  19. using Zanetti.SystemTrading;
  20. using Zanetti.SystemTrading.Screening;
  21. using Zanetti.SystemTrading.AutoTrading;
  22. using Zanetti.Indicators.Schema;
  23. namespace Zanetti.Indicators
  24. {
  25. internal class OscillatorGroup : IEnumerable {
  26. private string _name;
  27. private string _title;
  28. private int _index;
  29. private ArrayList _indicators;
  30. private ValueRange _type;
  31. private OscillatorGroup() {
  32. _indicators = new ArrayList();
  33. _type = ValueRange.Origin0;
  34. _name = "";
  35. _title = "";
  36. }
  37. public OscillatorGroup(SchemaOscillatorGroup gr) {
  38. _indicators = new ArrayList();
  39. _type = gr.Type;
  40. _name = gr.Name;
  41. _title = gr.Title;
  42. }
  43. public OscillatorGroup(string name, ValueRange vr) {
  44. _indicators = new ArrayList();
  45. _name = name;
  46. _title = name; //共有
  47. _type = vr;
  48. }
  49. public string Name {
  50. get {
  51. return _name;
  52. }
  53. }
  54. public ValueRange Type {
  55. get {
  56. return _type;
  57. }
  58. }
  59. public string Title {
  60. get {
  61. return _title;
  62. }
  63. }
  64. public int Index {
  65. get {
  66. return _index;
  67. }
  68. set {
  69. _index = value;
  70. }
  71. }
  72. public int Count {
  73. get {
  74. return _indicators.Count;
  75. }
  76. }
  77. public void AddIndicator(Indicator ind) {
  78. _indicators.Add(ind);
  79. }
  80. public IEnumerator GetEnumerator() {
  81. return _indicators.GetEnumerator();
  82. }
  83. public bool Contains(Indicator ind) {
  84. return _indicators.Contains(ind);
  85. }
  86. public static OscillatorGroup CreateDummy() {
  87. return new OscillatorGroup();
  88. }
  89. }
  90. internal enum ValueRange {
  91. Default,
  92. Percent0_1, //0-1のタイプ(RSIなど
  93. Percent1_1, //-1 - 1のタイプ(RCIなど
  94. Origin0, //0を軸にしたタイプ(乖離率
  95. }
  96. internal class IndicatorSet {
  97. private ChartFormat _format;
  98. private ArrayList _indicators;
  99. private Indicator[] _chartIndicators;
  100. private Indicator[] _valueWindowIndicators;
  101. private Indicator[] _explanationWindowIndicators;
  102. private ArrayList _oscillatorGroups;
  103. private ArrayList _predictionItems;
  104. private ArrayList _autoTradingItems;
  105. private ArrayList _screeningItems;
  106. private ArrayList _ichimokuKumo; //一目均衡表の雲は特別扱い
  107. private int _ichimokuSenkoDays;
  108. private bool _valid;
  109. public IndicatorSet(ChartFormat format) {
  110. _format = format;
  111. _indicators = new ArrayList();
  112. _oscillatorGroups = new ArrayList();
  113. _screeningItems = new ArrayList();
  114. _predictionItems = new ArrayList();
  115. _autoTradingItems = new ArrayList();
  116. _ichimokuKumo = new ArrayList();
  117. _valid = true;
  118. InitPrimitives();
  119. }
  120. public ChartFormat Format {
  121. get {
  122. return _format;
  123. }
  124. }
  125. //描画中のエラーが起きるとこのフラグをいじって無効化
  126. public bool Valid {
  127. get {
  128. return _valid;
  129. }
  130. set {
  131. _valid = value;
  132. }
  133. }
  134. private void InitPrimitives() {
  135. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.Date, "日付", "pdate", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetDate)));
  136. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.Open, "始値", "popen", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetOpen)));
  137. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.High, "高値", "phigh", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetHigh)));
  138. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.Low, "安値", "plow", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetLow)));
  139. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.Close, "終値", "pclose",new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetClose)));
  140. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.Volume, "出来高", "pvol", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetVolume)));
  141. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.CreditLong, "信用買残", "pcl", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetCreditLong)));
  142. _indicators.Add(new DelegateIndicator((int)PrimitiveIndicator.CreditShort, "信用売残", "pcs", new DelegateIndicator.Calculator(DataFarmPrimitiveAccess.GetCreditShort)));
  143. GetPrimitive2(PrimitiveIndicator.Volume).FormatString = "";
  144. GetPrimitive2(PrimitiveIndicator.Date).Display = IndicatorDisplay.None;
  145. //GetPrimitive2(PrimitiveIndicator.CreditLong).Display = IndicatorDisplay.None;
  146. //GetPrimitive2(PrimitiveIndicator.CreditShort).Display = IndicatorDisplay.None;
  147. DelegateIndicator ind = GetPrimitive2(PrimitiveIndicator.CreditLong);
  148. ind.FormatString = "";
  149. ind.Target = IndicatorTarget.Volume;
  150. ind.Appearance = Env.Preference.CreditLongAppearance;
  151. ind = GetPrimitive2(PrimitiveIndicator.CreditShort);
  152. ind.FormatString = "";
  153. ind.Target = IndicatorTarget.Volume;
  154. ind.Appearance = Env.Preference.CreditShortAppearance;
  155. }
  156. public Indicator GetPrimitive(PrimitiveIndicator ind) {
  157. return (Indicator)_indicators[(int)ind];
  158. }
  159. private DelegateIndicator GetPrimitive2(PrimitiveIndicator ind) {
  160. return (DelegateIndicator)_indicators[(int)ind];
  161. }
  162. public Indicator GetIndicator(int index) {
  163. return (Indicator)_indicators[index];
  164. }
  165. public Indicator FindFromAscii(string name) {
  166. foreach(Indicator ind in _indicators)
  167. if(ind.AsciiName==name) return ind;
  168. return null;
  169. }
  170. public int IndicatorCount {
  171. get {
  172. return _indicators.Count;
  173. }
  174. }
  175. public int OscillatorGroupCount {
  176. get {
  177. return _oscillatorGroups.Count;
  178. }
  179. }
  180. public OscillatorGroup GetOscillatorGroupAt(int i) {
  181. if(_oscillatorGroups.Count==0)
  182. return OscillatorGroup.CreateDummy();
  183. else
  184. return (OscillatorGroup)_oscillatorGroups[i];
  185. }
  186. public OscillatorGroup FindOscillatorGroup(string name) {
  187. foreach(OscillatorGroup g in _oscillatorGroups) {
  188. if(g.Name==name) return g;
  189. }
  190. return null;
  191. }
  192. //一目均衡表の特例パラメータ
  193. public IList IchimokuKumo {
  194. get {
  195. Debug.Assert(_ichimokuKumo.Count<=2);
  196. return _ichimokuKumo;
  197. }
  198. }
  199. //!!今は異なるChartFormatに同時にIndicatorSetが対応することはないのでfmtは無視
  200. public int GetAddedFutureLength(ChartFormat fmt) {
  201. #if DOJIMA
  202. //無双線表示時は少なくとも1日追加
  203. if(Dojima.DojimaChart.IsMusousenAvailable(fmt)) return Math.Max(1, _ichimokuSenkoDays);
  204. #endif
  205. return _ichimokuSenkoDays;
  206. }
  207. //非プリミティブで表示可能なやつのリストを返す
  208. public Indicator[] GetIndicatorsForChart() {
  209. if(_chartIndicators==null) {
  210. ArrayList ar = new ArrayList();
  211. foreach(Indicator ind in _indicators)
  212. if(ind.LaneID>=(int)PrimitiveIndicator.CreditLong &&
  213. (ind.Display & IndicatorDisplay.Chart)!=IndicatorDisplay.None &&
  214. ind.Target!=IndicatorTarget.Oscillator) ar.Add(ind);
  215. _chartIndicators = (Indicator[])ar.ToArray(typeof(Indicator));
  216. }
  217. return _chartIndicators;
  218. }
  219. public Indicator[] GetIndicatorsForValueWindow() {
  220. if(_valueWindowIndicators==null) {
  221. ArrayList ar = new ArrayList();
  222. foreach(Indicator ind in _indicators)
  223. if((ind.Display & IndicatorDisplay.Value)!=IndicatorDisplay.None) ar.Add(ind);
  224. _valueWindowIndicators = (Indicator[])ar.ToArray(typeof(Indicator));
  225. }
  226. return _valueWindowIndicators;
  227. }
  228. public Indicator[] GetIndicatorsForExplanationWindow() {
  229. if(_explanationWindowIndicators==null) {
  230. ArrayList ar = new ArrayList();
  231. foreach(Indicator ind in _indicators)
  232. if(ind.LaneID>=(int)PrimitiveIndicator.CreditLong &&
  233. (ind.Display & IndicatorDisplay.Explanation)!=IndicatorDisplay.None) ar.Add(ind);
  234. _explanationWindowIndicators = (Indicator[])ar.ToArray(typeof(Indicator));
  235. }
  236. return _explanationWindowIndicators;
  237. }
  238. private void ClearIndicatorCollectionCache() {
  239. _chartIndicators = null;
  240. _valueWindowIndicators = null;
  241. _explanationWindowIndicators = null;
  242. }
  243. public ScreeningItem[] GetScreeningItems() {
  244. return (ScreeningItem[])_screeningItems.ToArray(typeof(ScreeningItem));
  245. }
  246. public ExpressionIndicator AddExpressionIndicator(string expr_image, EvalResult[] args, string name, SchemaItemBase bi) {
  247. ExpressionConstructor ec = new ExpressionConstructor();
  248. new ZPredicationParser(new StringReader(expr_image), ec).Parse();
  249. Expression expr = ec.Result;
  250. int laneID = _indicators.Count;
  251. string asciiname = bi==null? name : bi.Name; //!!asciinameというネーミングはまずかった
  252. ExpressionIndicator ind = new ExpressionIndicator(laneID, name, asciiname, expr, args);
  253. _indicators.Add(ind);
  254. ClearIndicatorCollectionCache();
  255. //特別な扱いが必要なブツ
  256. if(asciiname=="ichimoku_senkouA" || asciiname=="ichimoku_senkouB") {
  257. _ichimokuKumo.Add(ind);
  258. if(((SchemaIndicatorItem)bi).Appearance.Appearances[0].Style!=IndicatorStyle.None) //未来領域を表示するやつがいれば値をセット
  259. _ichimokuSenkoDays = (int)args[1].DoubleVal;
  260. }
  261. return ind;
  262. }
  263. public void AddOscillatorGroup(OscillatorGroup gr) {
  264. _oscillatorGroups.Add(gr);
  265. gr.Index = _oscillatorGroups.Count-1;
  266. }
  267. public void AddScreeningItem(SchemaScreeningItem si, EvalResult[] args, string title) {
  268. ExpressionConstructor ee = new ExpressionConstructor();
  269. new ZPredicationParser(new StringReader(si.RawExpression), ee).Parse();
  270. Expression filter = null;
  271. if(si.RawFilter.Length>0) { //これはないこともある
  272. ExpressionConstructor ef = new ExpressionConstructor();
  273. new ZPredicationParser(new StringReader(si.RawFilter), ef).Parse();
  274. filter = ef.Result;
  275. }
  276. ScreeningItem it = new ScreeningItem(title, args, ee.Result, filter);
  277. it.FormatString = si.FormatString;
  278. it.FormatModifier = si.FormatModifier;
  279. _screeningItems.Add(it);
  280. }
  281. public void AddPredictionItem(SchemaPredictionItem it, EvalResult[] args, string title, string header) {
  282. ExpressionConstructor ec = new ExpressionConstructor();
  283. new ZPredicationParser(new StringReader(it.RawCondition), ec).Parse();
  284. ExpressionConstructor ep = new ExpressionConstructor();
  285. new ZPredicationParser(new StringReader(it.RawClaim), ep).Parse();
  286. _predictionItems.Add(new PredictionItem(title, header, args, ec.Result, ep.Result));
  287. }
  288. public void AddAutoTradingItem(SchemaAutoTradingItem it, EvalResult[] args, string title, string header) {
  289. ExpressionConstructor es = new ExpressionConstructor();
  290. new ZPredicationParser(new StringReader(it.RawSignal), es).Parse();
  291. ExpressionConstructor ee = new ExpressionConstructor();
  292. new ZPredicationParser(new StringReader(it.RawExit), ee).Parse();
  293. ExpressionConstructor el = new ExpressionConstructor();
  294. new ZPredicationParser(new StringReader(it.RawLosscut), el).Parse();
  295. Expression gyakusashine = null;
  296. if(it.RawEntryType==EntryType.Gyakusashine) {
  297. ExpressionConstructor eg = new ExpressionConstructor();
  298. new ZPredicationParser(new StringReader(it.RawGyakusashine), eg).Parse();
  299. gyakusashine = eg.Result;
  300. }
  301. _autoTradingItems.Add(new AutoTradingItem(title, header, it.TradingType, args, es.Result, it.RawEntryType, gyakusashine, ee.Result, el.Result));
  302. }
  303. public IEnumerable OscillatorGroups {
  304. get {
  305. return _oscillatorGroups;
  306. }
  307. }
  308. //!!このあたりの一貫性のなさひどい
  309. public IEnumerable PredictionItems {
  310. get {
  311. return _predictionItems;
  312. }
  313. }
  314. public AutoTradingItem[] AutoTradingItems {
  315. get {
  316. return (AutoTradingItem[])_autoTradingItems.ToArray(typeof(AutoTradingItem));
  317. }
  318. }
  319. }
  320. internal interface IIndicatorCustomizer {
  321. void ModifyIndicatorSet(IndicatorSet indicators);
  322. }
  323. internal class IndicatorSetBuilder {
  324. private IndicatorSet _result;
  325. private IIndicatorCustomizer _customizer;
  326. private class FixedParameters {
  327. public string title;
  328. public string header;
  329. public EvalResult[] args;
  330. }
  331. private FixedParameters FillParameter(SchemaItem it, ChartFormat format, int index) {
  332. FixedParameters result = new FixedParameters();
  333. ArrayList pl_value = new ArrayList();
  334. ArrayList pl_string = new ArrayList();
  335. foreach(SchemaParameter p in it.Parameters) {
  336. if(format==ChartFormat.Daily
  337. #if DOJIMA
  338. || format==ChartFormat.HalfDaily //パラメータを読み出すときは半日足のときも日足と同じ
  339. #endif
  340. ) {
  341. pl_value.Add(new EvalResult(p.DailyValues[index]));
  342. pl_string.Add(p.DailyValues[index] + p.DailyUnit);
  343. }
  344. else if(format==ChartFormat.Weekly){
  345. pl_value.Add(new EvalResult(p.WeeklyValues[index]));
  346. pl_string.Add(p.WeeklyValues[index] + p.WeeklyUnit);
  347. }
  348. else if (format == ChartFormat.Yearly)
  349. {
  350. pl_value.Add(new EvalResult(p.YearlyValues[index]));
  351. pl_string.Add(p.YearlyValues[index] + p.YearlyUnit);
  352. }
  353. else
  354. { // monthly
  355. pl_value.Add(new EvalResult(p.MonthlyValues[index]));
  356. pl_string.Add(p.MonthlyValues[index] + p.MonthlyUnit);
  357. }
  358. }
  359. Debug.Assert(it.HeaderString!=null);
  360. result.title = it.Title;
  361. result.header = String.Format(it.HeaderString, pl_string.ToArray());
  362. result.args = (EvalResult[])pl_value.ToArray(typeof(EvalResult));
  363. return result;
  364. }
  365. public IndicatorSet Result {
  366. get {
  367. return _result;
  368. }
  369. }
  370. public IIndicatorCustomizer Customizer {
  371. get {
  372. return _customizer;
  373. }
  374. set {
  375. _customizer = value;
  376. }
  377. }
  378. public void Construct(ChartFormat format) {
  379. _result = new IndicatorSet(format);
  380. ArrayList col = new ArrayList();
  381. Hashtable nameToGroup = new Hashtable();
  382. Env.Schema.CollectOscillatorGroup(col);
  383. int index = 0;
  384. foreach(SchemaOscillatorGroup gr in col) {
  385. OscillatorGroup og = new OscillatorGroup(gr);
  386. og.Index = index++;
  387. _result.AddOscillatorGroup(og);
  388. nameToGroup[gr.Name] = og;
  389. }
  390. col.Clear();
  391. Env.Schema.CollectIndicatorSchema(col);
  392. foreach(SchemaIndicatorItem si in col) {
  393. int n = si.MaxInstanceCount;
  394. for(int i=0; i<n; i++) {
  395. SchemaAppearance sa = si.Appearance;
  396. if(sa!=null && (sa.Appearances.Length<=i || sa.Appearances[i].Style==IndicatorStyle.None)) continue;
  397. FixedParameters param = FillParameter(si, format, i);
  398. ExpressionIndicator ind = _result.AddExpressionIndicator(si.RawExpression, param.args, param.header, si);
  399. ind.Appearance = sa==null? null : sa.Appearances[i];
  400. ind.Display = si.Display;
  401. ind.Target = si.Target;
  402. ind.GroupName = si.GroupName;
  403. ind.FormatString = si.FormatString;
  404. ind.FormatModifier = si.FormatModifier;
  405. ind.TargetBrand = TargetBrandCondition.Parse(si.TargetBrand);
  406. ind.RelativiseParam = RelativiseParam.Parse(si.RelativiseParam);
  407. if(ind.Target==IndicatorTarget.Oscillator)
  408. ((OscillatorGroup)nameToGroup[ind.GroupName]).AddIndicator(ind); //!!エントリがなかったときのエラーハンドリング
  409. }
  410. }
  411. //!!この項目収集はいかがわしい
  412. col.Clear();
  413. Env.Schema.CollectScreeningSchema(col);
  414. foreach(SchemaScreeningItem si in col) {
  415. FixedParameters param = FillParameter(si, format, 0);
  416. _result.AddScreeningItem(si, param.args, param.header);
  417. }
  418. col.Clear();
  419. Env.Schema.CollectPredictionSchema(col);
  420. foreach(SchemaPredictionItem si in col) {
  421. FixedParameters param = FillParameter(si, format, 0);
  422. _result.AddPredictionItem(si, param.args, param.title, param.header);
  423. }
  424. col.Clear();
  425. Env.Schema.CollectAutoTradingSchema(col);
  426. foreach(SchemaAutoTradingItem si in col) {
  427. FixedParameters param = FillParameter(si, format, 0);
  428. _result.AddAutoTradingItem(si, param.args, param.title, param.header);
  429. }
  430. //library
  431. col.Clear();
  432. Env.Schema.CollectLibraryFunction(col);
  433. foreach(SchemaExtensionLibrary lib in col) {
  434. ExtendedLibraryFunction f = new ExtendedLibraryFunction(lib.Name, lib.Expression);
  435. Env.ArithmeticLibrary.Add(lib.Name, new EvalDelegate(f.Calc), new DateRangeDelegate(f.CalcDateRange));
  436. }
  437. //customizer
  438. if(_customizer!=null) _customizer.ModifyIndicatorSet(_result);
  439. }
  440. }
  441. internal class AsyncSchemaLoader {
  442. private IntPtr _parent;
  443. private IndicatorSet _indicators;
  444. private string _errorMessage;
  445. public IndicatorSet IndicatorSet {
  446. get {
  447. return _indicators;
  448. }
  449. }
  450. public string ErrorMessage {
  451. get {
  452. return _errorMessage;
  453. }
  454. }
  455. public AsyncSchemaLoader(IWin32Window p) {
  456. _parent = p.Handle;
  457. }
  458. public void AsyncLoad() {
  459. Thread th = new Thread(new ThreadStart(Run));
  460. th.Priority = ThreadPriority.Normal;
  461. th.Start();
  462. }
  463. private void Run() {
  464. try {
  465. //long t = DateTime.Now.Ticks;
  466. LoadSchema();
  467. BuildIndicators();
  468. Env.Frame.WarmUpMagicLibrary();
  469. //Debug.WriteLine("Load Time " + (DateTime.Now.Ticks-t)/10000);
  470. Win32.SendMessage(_parent, AsyncConst.WM_ASYNCPROCESS, IntPtr.Zero, new IntPtr(AsyncConst.LPARAM_FINISHED));
  471. }
  472. catch(Exception ex) {
  473. Util.SilentReportCriticalError(ex);
  474. _errorMessage = ex.Message;
  475. Win32.SendMessage(_parent, AsyncConst.WM_ASYNCPROCESS, IntPtr.Zero, new IntPtr(AsyncConst.LPARAM_ERROR));
  476. }
  477. }
  478. private void LoadSchema() {
  479. StorageNode rs = Env.RootStorageNode;
  480. Env.Schema.Load(Env.GetAppDir() + "extension", rs==null? null : rs.FindChildNode("params"));
  481. }
  482. private void BuildIndicators() {
  483. IndicatorSetBuilder bld = new IndicatorSetBuilder();
  484. bld.Construct(Env.Options.ChartFormat);
  485. _indicators = bld.Result;
  486. }
  487. }
  488. }
ダウンロード 印刷用表示

このコピペの URL

JavaScript での埋め込み

iframe での埋め込み

元のテキスト