初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1302 1...129512961297129812991300130113021303130413051306130713081309...1503 新しいコメント Vladimir Karputov 2021.04.09 11:19 #13011 User_mt5:ウラジーミル・カルプトフ、そして私?) 確実なことは言えませんが、0.0を試してみてください。 追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。 User_mt5 2021.04.09 11:44 #13012 Vladimir Karputov:確実なことは言えませんが、0.0を試してみてください。追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。 残念... ご返信ありがとうございました。 (レベルについても同じ問題がありますが、レベル数を 設定することで解決します。) Alexey Viktorov 2021.04.09 12:02 #13013 User_mt5:残念...返信ありがとうございました。(レベルに関する問題も実は同じで、レベル数を 設定することで解決します) 実験すれば、すべてがうまくいく。 Vladimir Karputov 2021.04.09 12:12 #13014 User_mt5: チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています) <indicator> name=Stochastic Oscillator path= apply=0 show_data=1 scale_inherit=0 scale_line=0 scale_line_percent=50 scale_line_value=0.000000 scale_fix_min=1 scale_fix_min_val=0.000000 scale_fix_max=1 scale_fix_max_val=100.000000 expertmode=0 fixed_height=-1 <indicator> name=Stochastic Oscillator path= apply=0 show_data=1 scale_inherit=0 scale_line=0 scale_line_percent=50 scale_line_value=0.000000 scale_fix_min=0 scale_fix_min_val=-10.500000 scale_fix_max=0 scale_fix_max_val=110.500000 expertmode=0 fixed_height=-1 これは明らかに「bool」型のプロパティですが、MQL5言語からこのプロパティにアクセスすることはできません。 User_mt5 2021.04.09 12:35 #13015 Vladimir Karputov:チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています)これは明らかに「bool」タイプのプロパティですが、MQL5言語内からはこのプロパティにアクセスすることはできません。 はい、残念です。 また、ありがとうございます) Maksym Mudrakov 2021.04.09 14:41 #13016 問題があるのです。関数(下記参照)を使用すると、ヒストリーからポジションIDごとにTakeProfitとStopLossの値を取得できます(つまり、ポジションがすでにクローズされている場合)。この関数はリアルタイムでは機能しますが、ストラテジーテスターでは、ストップを設定したヒストリーの注文が見えないため、TakeProfitとStopLossを見つけられません(重要:ストップはポジションオープン後に設定されます)。 質問:チケットに基づいてクローズしたポジションのTP/Lossを調べるには、Strategy Testerをどのように使用すればよいですか? #include <Trade\DealInfo.mqh> #include <Trade\HistoryOrderInfo.mqh> CDealInfo deal; CHistoryOrderInfo ord; void GetPosStops(ulong ticket, int& tp, int& sl, double& lot){ HistorySelectByPosition(ticket); tp=0;sl=0; double open=0, tp_=0, sl_=0; string symbol=""; ENUM_DEAL_TYPE type=-1; for(int i=0; i<HistoryDealsTotal(); i++){ if(!deal.SelectByIndex(i))continue; if(deal.Entry() ==DEAL_ENTRY_IN){ open=deal.Price(); symbol=deal.Symbol(); type=deal.DealType(); lot=deal.Volume(); break; } } for(int i=0; i<HistoryOrdersTotal(); i++){ if(!ord.SelectByIndex(i))continue; if(tp_==0)tp_=ord.TakeProfit(); if(sl_==0)sl_=ord.StopLoss(); if(tp_>0 && sl_>0)break; } if(symbol !=""){ double coef=type==DEAL_TYPE_BUY ? 1:-1; double point=SymbolInfoDouble(symbol,SYMBOL_POINT); if(tp_>0 && coef*tp_>coef*open) tp=(int)(MathAbs(tp_-open)/point); if(sl_>0 && coef*sl_<coef*open) sl=(int)(MathAbs(sl_-open)/point); } } Ancorage 2021.04.09 20:25 #13017 皆さんこんにちは! 私はちょうどEAをプログラムしようとしていて、統計的な スプレッドコレクターを書く ことから始めたいと思います。 つまり、何をさせたいのか?テスターでは、EAを起動し、一定期間(例えば10日間)のティック履歴のデータを収集します。 そして、次のデータをcsvまたはxlsxファイルに生成します。 期間中の平均スプレッド:サーバー上の00:00 - 09:00、09:00 - 18:00、18:00 - 00:00 (10日間すべて)、この時間の最大スプレッド、10日間全体の最小スプレッド、通貨ペアの平均スプレッド。 このデータを手動で集めるのは本当に疲れています。 自分でなんとかしてくれるプログラムがあると知っていますが...。 もしかしたら、尊敬する目利きの方なら、何から始めたらいいか教えてくれるかもしれませんね。また、そのようなプログラムを書くことは可能なのでしょうか? 回答してくださった方、新参者に共感してくださった方、ありがとうございました。 Pavel Komarovsky 2021.05.04 05:42 #13018 皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。 Vladimir Karputov 2021.05.04 06:04 #13019 Pavel Komarovsky:皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。 だいたいこんな感じです。 //+------------------------------------------------------------------+ //| Script 1.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //--- //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double start_deposit=3000; double start_lot=0.01; double deposit=start_deposit; for(int i=0; i<10; i++) { double d=MathFloor(deposit/start_deposit); Print(i,"#: ,deposit ",DoubleToString(deposit,2),", d ",DoubleToString(d*start_lot,2)); //--- deposit=deposit+start_deposit*0.55; } } //+------------------------------------------------------------------+ 結果 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 0#: ,deposit 3000.00, d 0.01 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 1#: ,deposit 4650.00, d 0.01 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 2#: ,deposit 6300.00, d 0.02 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 3#: ,deposit 7950.00, d 0.02 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 4#: ,deposit 9600.00, d 0.03 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 5#: ,deposit 11250.00, d 0.03 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 6#: ,deposit 12900.00, d 0.04 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 7#: ,deposit 14550.00, d 0.04 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 8#: ,deposit 16200.00, d 0.05 2021.05.04 09:03:15.246 Script 1 (EURUSD,H1) 9#: ,deposit 17850.00, d 0.05 ファイル: Script_1.mq5 3 kb afsmerinostra 2021.05.04 19:53 #13020 良い時間です。 バグを見つけるのを手伝ってください・・・。スクリプトでインジケータバッファから バー値(BarsCount)をコピーして、値をループしてシグナルを検出してPrint()に出力しています。簡単そうで、そうでもないですね・・・。ゼロラインを越える以外は、思い通りの信号が得られます。 CROSSOVER_OR_REVERSE もしかしたら、スクリプトがそのようなことをしてはいけないのかもしれません。 コードとログのスクリーンショットを添付しました。 //+------------------------------------------------------------------+ //| B_O_P_Signals.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ enum enMaTypes { ma_sma, // Simple moving average ma_ema, // Exponential moving average ma_smma, // Smoothed MA ma_lwma // Linear weighted MA }; input int inpSmoothPeriod = 14; // Result smoothing period input enMaTypes inpSmoothMethod = ma_sma; // Result smoothing type input double inpLevelUp = 0.2; // Level up input double inpLevelDown = -0.2; // Level down input int BarsCount = 100; double Mid_line[1] = {0.0}; int handle=0; double TREND_VAL[]; void OnStart() { handle = iCustom(_Symbol,PERIOD_CURRENT,"Balance of Market Power",inpSmoothPeriod,inpSmoothMethod,inpLevelUp,inpLevelDown); CopyBuffer(handle,2,0,BarsCount,TREND_VAL); ArraySetAsSeries(TREND_VAL,true); string Signal =""; for (int i=ArraySize(TREND_VAL)-1; i>=0; i--) { int k=1; if(TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] > inpLevelUp) Signal = "TREND_UP"; else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] > Mid_line[0] && TREND_VAL[i] < inpLevelUp) Signal = "TREND_UP_ROLLBACK_OR_FLAT"; else if(TREND_VAL[i] >= Mid_line[0] && TREND_VAL[i+k] <= Mid_line[0]) Signal ="CROSSOVER_OR_REVERSE_UP"; else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] < inpLevelDown) Signal = "TREND_DN"; else if (TREND_VAL[i] != EMPTY_VALUE && TREND_VAL[i] < Mid_line[0] && TREND_VAL[i] > inpLevelDown) Signal = "TREND_DN_ROLLBACK_OR_FLAT"; else if(TREND_VAL[i] < Mid_line[0] && TREND_VAL[i+k] > Mid_line[0]) Signal = "CROSSOVER_OR_REVERSE_DN"; else Signal = "UNKNOWN_SIGNAL"; Print(string(i),"_", Signal); } } //+------------------------------------------------------------------+ ファイル: Question.png 150 kb 1...129512961297129812991300130113021303130413051306130713081309...1503 新しいコメント 理由: キャンセル 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
ウラジーミル・カルプトフ、そして私?)
確実なことは言えませんが、0.0を試してみてください。
追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。
確実なことは言えませんが、0.0を試してみてください。
追記:MQL5で「INDICATOR_MINIMUM」「INDICATOR_MAXIMUM」をキャンセルすることができないようです。
残念...
ご返信ありがとうございました。
(レベルについても同じ問題がありますが、レベル数を 設定することで解決します。)
残念...
返信ありがとうございました。
(レベルに関する問題も実は同じで、レベル数を 設定することで解決します)
実験すれば、すべてがうまくいく。
チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています)
これは明らかに「bool」型のプロパティですが、MQL5言語からこのプロパティにアクセスすることはできません。
チャートが保存するプロパティを比較してみました('Stochastic Oscillator'インジケータを例にしています)
これは明らかに「bool」タイプのプロパティですが、MQL5言語内からはこのプロパティにアクセスすることはできません。
はい、残念です。
また、ありがとうございます)
問題があるのです。関数(下記参照)を使用すると、ヒストリーからポジションIDごとにTakeProfitとStopLossの値を取得できます(つまり、ポジションがすでにクローズされている場合)。この関数はリアルタイムでは機能しますが、ストラテジーテスターでは、ストップを設定したヒストリーの注文が見えないため、TakeProfitとStopLossを見つけられません(重要:ストップはポジションオープン後に設定されます)。
質問:チケットに基づいてクローズしたポジションのTP/Lossを調べるには、Strategy Testerをどのように使用すればよいですか?
私はちょうどEAをプログラムしようとしていて、統計的な スプレッドコレクターを書く ことから始めたいと思います。
つまり、何をさせたいのか?テスターでは、EAを起動し、一定期間(例えば10日間)のティック履歴のデータを収集します。
そして、次のデータをcsvまたはxlsxファイルに生成します。
期間中の平均スプレッド:サーバー上の00:00 - 09:00、09:00 - 18:00、18:00 - 00:00 (10日間すべて)、この時間の最大スプレッド、10日間全体の最小スプレッド、通貨ペアの平均スプレッド。
このデータを手動で集めるのは本当に疲れています。
自分でなんとかしてくれるプログラムがあると知っていますが...。
もしかしたら、尊敬する目利きの方なら、何から始めたらいいか教えてくれるかもしれませんね。また、そのようなプログラムを書くことは可能なのでしょうか?
回答してくださった方、新参者に共感してくださった方、ありがとうございました。
皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。
皆さん、こんにちは。もしかしたら、誰かが用意したコードを持っているかもしれません。2つのパラメータがあります、預金=3000とロット0.01すなわち預金3000ロットは0.01になります、今厳密に倍増時すなわち預金6000ロットは0.02になり、9000は0.03になりますどうすればいいのでしょう。
だいたいこんな感じです。
結果
良い時間です。
バグを見つけるのを手伝ってください・・・。スクリプトでインジケータバッファから バー値(BarsCount)をコピーして、値をループしてシグナルを検出してPrint()に出力しています。簡単そうで、そうでもないですね・・・。ゼロラインを越える以外は、思い通りの信号が得られます。
CROSSOVER_OR_REVERSE
もしかしたら、スクリプトがそのようなことをしてはいけないのかもしれません。 コードとログのスクリーンショットを添付しました。