MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1357 1...135013511352135313541355135613571358135913601361136213631364...1953 新しいコメント Tretyakov Rostyslav 2021.01.22 11:57 #13561 DanilaMactep: そしてこの処理は、order-sendで注文を出そうとした各行の後に記述する必要がありますね。 全取引 終了後 OrderSend()、OrderClose()、OrderCloseBy()、OrderModify()、OrderDelete() DanilaMactep 2021.01.22 12:01 #13562 MakarFX:全取引 終了後 OrderSend()、OrderClose()、OrderCloseBy()、OrderModify()、OrderDelete() Expert Advisor がチャートから削除された場合、再度手動で追加しない限り機能しません。自動で動作するようにリセットするにはどうしたらよいですか? Tretyakov Rostyslav 2021.01.22 12:06 #13563 DanilaMactep: これは、order-send を使って注文を出そうとする各行の後に書かなければならないのですが、これでいいのでしょうか? に関するエラーを除外した場合 mode_stoplevel、 mode_tradeallowed、 mode_minlot、mode_lotstep、mode_maxlot そうすれば、フクロウがサーバーを叩くこともないでしょう。 Tretyakov Rostyslav 2021.01.22 12:07 #13564 DanilaMactep: チャートからEAを削除してしまうと、再度手動でアップロードするまで動作しません。自動でリセットするにはどうしたらいいですか? 自動でできない、エラー訂正のためのものです Vasyl Temchenko 2021.01.22 12:53 #13565 DanilaMactep:そしてこのケースは、ordersend を使って注文を開こうとする各行の後に書かなければならないのですね。 もし「この場合」というのが、許容される最小・最大注文量、注文量の段階、許容される最大取引数+注文、フリーマージンの十分性 (これらは、バリデータが最も頻繁に拒否する主要ポイントです) をチェックすることを意味するなら、たとえば OrderCheck という関数を一つ 記述する方が合理的でしょう。 そして、新しい取引を開始する前に、単純にボリュームをチェックします。 だいたいそうです。 Lot=OrderCheck(OP_BUY,Lot); // или Lot=OrderCheck(OP_SELL,Lot); Alexey Belyakov 2021.01.22 13:04 #13566 親愛なるプログラマーの皆さん、ごきげんよう。一日前からある問題に悩んでいて、解決できないんです。解決してください。 肝心なのは、そのことだ。 対象商品はRTS先物、期間はM5。 アルゴリズムは、時間に応じてパラメータSLとTPを変更する必要があり、重要なことは、オープンポジションは、特定の条件が満たされた場合、TP(要求.tp = ...)とカウンターマーケット注文によって閉じられていないことです。 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1)の3つのインターバルが存在します。min<=03) // 12:00:01〜12:03:00まで 2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00 3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00 区間 "1 "のパラメータSL、TP=200、200。 間隔 "2)"、"3) "において、SL、TP=100、100 問題:このアルゴリズムは、現在のスイッチにのみ利益を確定するが、さらにn個のローソク足(少なくとも10-15)の間、利益確定条件を維持する必要がある チャート期間M5 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ datetime some_time=TimeCurrent(); #define EXPERT_MAGIC 1010 // MagicNumber эксперта //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { double Ask = SymbolInfoDouble(NULL, SYMBOL_ASK); double Bid = SymbolInfoDouble(NULL, SYMBOL_BID); double SL=0; double TP=0; datetime tm=TimeCurrent(); MqlDateTime stm; TimeToStruct(tm,stm); bool is_siesta=false; if (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // Условия SL и TP работают только в этом интервале времени { SL=200/_Point; TP=200/_Point; is_siesta=true; } else { if(((stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09)) || (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04)) // Условия SL и TP работают только в этих интервалах времени { SL=100/_Point; TP=100/_Point; // тейк профит закрывается кодом is_siesta=true; } else { return; } } double Lots=1; datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению datetime static timeOpen = 0; if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); request.deviation= 5; request.sl = NormalizeDouble(Ask-SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); request.deviation= 5; request.sl = NormalizeDouble(Bid+SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp } Совершение сделок - Торговые операции - Справка по MetaTrader 5 www.metatrader5.com Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением... Any questions from newcomers EuroX2.ex4についてご意見をお聞かせください。 EuroX2.ex4 any comments? Tretyakov Rostyslav 2021.01.22 14:28 #13567 Alexey Belyakov: 問題点:このアルゴリズムでは、電流のスイッチだけで利益を確定しているが、nカーブ(少なくとも10-15)に対して利益確定の条件を維持する必要がある。 M5チャート期間 SLとTPの動作はコード内の時間によって制限されます。 シエスタのSLとTPは別々で、シエスタのSLとTPは別々です Tretyakov Rostyslav 2021.01.22 16:11 #13568 Alexey Belyakov:親愛なるプログラマーの皆さん、ごきげんよう。一日前からある問題に悩んでいて、解決できないんです。よろしくお願いします。 再生時間やバー 数の変更は可能か //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ datetime some_time=TimeCurrent(); #define EXPERT_MAGIC 1010 // MagicNumber эксперта input string TimeStart_1= "12:00:01"; input string TimeStop_1 = "12:03:00"; input string TimeStart_2= "16:05:01"; input string TimeStop_2 = "16:09:00"; input string TimeStart_3= "20:00:11"; input string TimeStop_3 = "20:04:00"; input int BarTrade = 10; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { double Ask = SymbolInfoDouble(NULL, SYMBOL_ASK); double Bid = SymbolInfoDouble(NULL, SYMBOL_BID); double SL=0; double TP=0; datetime tm=TimeCurrent(); MqlDateTime stm; TimeToStruct(tm,stm); int TimeBarTrade=BarTrade*Period()*60; bool is_siesta=false; if((TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=StringToTime(TimeStop_1))|| (TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=StringToTime(TimeStop_2))|| (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=StringToTime(TimeStop_3))) {is_siesta=true;} else {is_siesta=false;} if(TimeCurrent()>=StringToTime(TimeStart_1) && TimeCurrent()<=(StringToTime(TimeStop_1)+TimeBarTrade)) { SL=200/_Point; TP=200/_Point; } if((TimeCurrent()>=StringToTime(TimeStart_2) && TimeCurrent()<=(StringToTime(TimeStop_2)+TimeBarTrade))|| (TimeCurrent()>=StringToTime(TimeStart_3) && TimeCurrent()<=(StringToTime(TimeStop_3)+TimeBarTrade))) { SL=100/_Point; TP=100/_Point; } double Lots=1; datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрению datetime static timeOpen = 0; if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); request.deviation= 5; request.sl = NormalizeDouble(Ask-SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); request.deviation= 5; request.sl = NormalizeDouble(Bid+SL*_Point,_Digits); request.magic = 1010; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки timeOpen = timeBar; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_BUY; request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY) if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт. { MqlTradeRequest request= {0}; MqlTradeResult result= {0}; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ulong magic=PositionGetInteger(POSITION_MAGIC); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции if((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику { request.action =TRADE_ACTION_DEAL; request.symbol =Symbol(); request.volume =Lots; request.type =ORDER_TYPE_SELL; request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp } Alexey Belyakov 2021.01.22 19:51 #13569 MakarFXさん、ありがとうございました。本来の機能を発揮している Tretyakov Rostyslav 2021.01.22 20:44 #13570 Alexey Belyakov: MakarFXさん、ありがとうございました。これで正常に動作するようになりました。 どういたしまして) 1...135013511352135313541355135613571358135913601361136213631364...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
そしてこの処理は、order-sendで注文を出そうとした各行の後に記述する必要がありますね。
全取引 終了後 OrderSend()、OrderClose()、OrderCloseBy()、OrderModify()、OrderDelete()
全取引 終了後 OrderSend()、OrderClose()、OrderCloseBy()、OrderModify()、OrderDelete()
これは、order-send を使って注文を出そうとする各行の後に書かなければならないのですが、これでいいのでしょうか?
に関するエラーを除外した場合
mode_stoplevel、 mode_tradeallowed、 mode_minlot、mode_lotstep、mode_maxlot
そうすれば、フクロウがサーバーを叩くこともないでしょう。
チャートからEAを削除してしまうと、再度手動でアップロードするまで動作しません。自動でリセットするにはどうしたらいいですか?
そしてこのケースは、ordersend を使って注文を開こうとする各行の後に書かなければならないのですね。
もし「この場合」というのが、許容される最小・最大注文量、注文量の段階、許容される最大取引数+注文、フリーマージンの十分性 (これらは、バリデータが最も頻繁に拒否する主要ポイントです) をチェックすることを意味するなら、たとえば OrderCheck という関数を一つ 記述する方が合理的でしょう。
そして、新しい取引を開始する前に、単純にボリュームをチェックします。
だいたいそうです。
親愛なるプログラマーの皆さん、ごきげんよう。一日前からある問題に悩んでいて、解決できないんです。解決してください。
肝心なのは、そのことだ。
対象商品はRTS先物、期間はM5。
アルゴリズムは、時間に応じてパラメータSLとTPを変更する必要があり、重要なことは、オープンポジションは、特定の条件が満たされた場合、TP(要求.tp = ...)とカウンターマーケット注文によって閉じられていないことです。
1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.sec>=1)の3つのインターバルが存在します。min<=03) // 12:00:01〜12:03:00まで
2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00
3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00
区間 "1 "のパラメータSL、TP=200、200。
間隔 "2)"、"3) "において、SL、TP=100、100
問題:このアルゴリズムは、現在のスイッチにのみ利益を確定するが、さらにn個のローソク足(少なくとも10-15)の間、利益確定条件を維持する必要がある
チャート期間M5
Alexey Belyakov:
問題点:このアルゴリズムでは、電流のスイッチだけで利益を確定しているが、nカーブ(少なくとも10-15)に対して利益確定の条件を維持する必要がある。
M5チャート期間
SLとTPの動作はコード内の時間によって制限されます。 シエスタのSLとTPは別々で、シエスタのSLとTPは別々です
親愛なるプログラマーの皆さん、ごきげんよう。一日前からある問題に悩んでいて、解決できないんです。よろしくお願いします。
再生時間やバー 数の変更は可能か
MakarFXさん、ありがとうございました。これで正常に動作するようになりました。
どういたしまして)