もちろん、お客様のケースを確認させていただきます。
しかし、一般的にOrderSend関数は ヘルプに従って動作します。
Возвращаемое значение
構造体の基本チェック(ポインタチェック)に成功した場合、true を返しますが 、これは取引操作の成功 は意味しません。関数の結果をより詳細に 知るためには、結果構造のフィールドを分析 する必要がある。
- www.mql5.com
いや、文句を言ってるんじゃなくて、理解したいだけなんです。もしかしたら、どこかで失敗したのかもしれない...。また、リザルトストラクチャーの フィールドがあるべき場所にあることを分析しました(教えられたとおり です)。
しかし、私の理解では、少なくとも、端末がOrderSend()関数(結果構造体のフィールドの取得と処理を含む)を完全に処理した後にのみ、次の演算子への移行が行われるはず なのですが?
(すみません、前の質問でresultの代わりにrequestを指定してしまいました)。
チャンピオンシップの初日、私のExpert Advisorは意図したとおりに動作しないことがわかりました。つまり、単一の保留命令の代わりに、いくつかの一方向の保留命令を配置します。これは、ほぼ同じ構造です。
質問:端末は、最初のブロックのOrderSend()関数が処理を終えるのを待つのか[つまり、リクエストを受信するのを待つ]、それとも、サーバーに取引リクエストを送信 した後、すぐに次のオペレータ(ブロック)に切り替わるのでしょうか?問題を確認する。保留中の注文のOrderSend()を設定した後、OrdersTotalが常にそれを見ているとは限りません。
OrderSend()の後に一時停止を設定しました。でも、今日のチャンピオンシップではロボットの役には立ちませんでしたが......)
他のスレッドでの議論へのリンク集です。
https://www.mql5.com/ru/forum/2236/page13/#comment_27472
https://www.mql5.com/ru/forum/2236/page13/#comment_27486
https://www.mql5.com/ru/forum/2236/page13/#comment_27503
https://www.mql5.com/ru/forum/2236/page14/#comment_27531(非同期について)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552
- www.mql5.com
こんにちは、Allです。
例えば、シンボル、数量、注文の種類を送信し、希望の方向のポジションが現れるまでループさせるというものです。
ログが出る
2012.01.09 16:08:42 取引 '9066293' : 0.0000 で 1.00 EURUSD のインスタント買いに失敗しました (偏差値: 103117312) [無効なストップ]。
では、マーケットで開く場合、なぜ始値を指定する必要があるのでしょうか?ストップはいらない。
F9で開くと思います。
私がどこで失敗したのか、または注文を開くためのコードを書いてください。
そんな最小限のもので構造を埋めているのです。
uint zOrderSend (string zSymbol, double zVolume, string zORDER_TYPE) { zSymbol = "EURUSD"; zVolume = 1; zORDER_TYPE ="Buy"; Alert ("*****************", zSymbol," ", zVolume," ", zORDER_TYPE); //--- готовим запрос MqlTradeRequest request; request.action=TRADE_ACTION_DEAL; // request.magic=0; request.symbol=zSymbol; // request.volume=zVolume; request.volume=zVolume; // request.price=0; // request.sl=0; // request.tp=0; // request.deviation=SymbolInfoInteger("EURUSD",SYMBOL_SPREAD); // slippage // request.deviation=50; //--- сформируем тип ордера if (zORDER_TYPE == "Buy" ) {request.type = ORDER_TYPE_BUY ;} // тип ордера = 0 if (zORDER_TYPE == "Sell") {request.type = ORDER_TYPE_SELL;} // тип ордера = 1 Alert ("Тип ордера: request.type = ",request.type); request.type_filling = ORDER_FILLING_FOK; request.type_time = ORDER_TIME_GTC; // request.comment = "";ポジションを開く ためのExpert Advisorのテストは、すべてこのファイルにあります。
こんにちは、Allです。
つまり、シンボル、数量、注文タイプを送信し、希望の方向のポジションが表示されるまでループさせるのです。
そして、成行注文にストップは必要ないのに、何かで「Invalid Stops」と表示されます。どこを間違えているのかわからない...。
Expert Advisorがポジションを 開くまでの全テストは、ファイル内にあります。
ほら、うまくいくはずだ。
//+------------------------------------------------------------------+ //| Deal.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(1); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Alert("Купили!"); } else Alert("Не купили...."); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ uint zOrderSend(string zSymbol,double zVolume,ENUM_ORDER_TYPE zORDER_TYPE) { MqlTradeRequest request; MqlTradeCheckResult ch_result; MqlTradeResult result; // обнулим структуру запроса перед заполнением ZeroMemory(request); Alert("*****************",zSymbol," ",zVolume," ",zORDER_TYPE); // заполняем структуру request.action=TRADE_ACTION_DEAL; request.type_filling=ORDER_FILLING_AON; request.symbol=zSymbol; request.type=zORDER_TYPE; request.deviation=30; request.sl=0.0; request.tp=0.0; request.volume=zVolume; if(zORDER_TYPE==ORDER_TYPE_BUY)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); if(zORDER_TYPE==ORDER_TYPE_SELL)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // выводим на печать заполненную структуру торгового запроса Alert(" ENUM_TRADE_REQUEST_ACTIONS request.action; // Тип выполняемого действия =",request.action,"="); Alert(" ulong request.magic; // Штамп эксперта (идентификатор magic number) =", request.magic, "=" ); Alert(" ulong request.order; // Тикет ордера =", request.order, "=" ); Alert(" string request.symbol; // Имя торгового инструмента =", request.symbol, "=" ); Alert(" double request.volume; // Запрашиваемый объем сделки в лотах =", request.volume, "=" ); Alert(" double request.price; // Цена =", request.price, "=" ); Alert(" double request.stoplimit; // Уровень StopLimit ордера =", request.stoplimit, "=" ); Alert(" double request.sl; // Уровень Stop Loss ордера =", request.sl, "=" ); Alert(" double request.tp; // Уровень Take Profit ордера =", request.tp, "=" ); Alert(" ulong request.deviation; // Максимально приемлемое отклонение от запрашиваемой цены =", request.deviation, "=" ); Alert(" ENUM_ORDER_TYPE request.type; // Тип ордера =", request.type, "=" ); Alert(" ENUM_ORDER_TYPE_FILLING request.type_filling; // Тип ордера по исполнению =", request.type_filling, "=" ); Alert(" ENUM_ORDER_TYPE_TIME request.type_time; // Тип ордера по времени действия =", request.type_time, "=" ); Alert(" datetime request.expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) =", request.expiration, "=" ); Alert(" string request.comment; // Комментарий к ордеру =", request.comment, "=" ); // отправляем структуру запроса на проверку if(OrderCheck(request,ch_result)==false) { Alert("OrderCheck выявил ошибку: "+IntegerToString(ch_result.retcode)+"/"+ch_result.comment); return ch_result.retcode; } // отправляем запрос на торговый сервер if(OrderSend(request,result)==false) { Alert("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment); return result.retcode; } // выводим на печать структуру ответа сервера Alert("Код результата операции сервера: " + IntegerToString(result.retcode)); Alert("deal Тикет сделки " + IntegerToString(result.deal)); Alert("order Тикет ордера " + IntegerToString(result.order)); Alert("volume Объем сделки " + DoubleToString (result.volume)); Alert("price Цена в сделке " + DoubleToString (result.price)); Alert("bid(цены реквоты) " + DoubleToString (result.bid)); Alert("ask(цены реквоты) " + DoubleToString (result.ask)); Alert("Комментарий: "+result.comment); return result.retcode; } //+------------------------------------------------------------------+
これで、うまくいくはずです。
ありがとうございます。効いてますね。しかも、ポジション情報を更新する暇もないほどの速さで。
その結果、2件の注文が入る。
1ミリ秒の休止で直る !
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
...は、ポジション情報を更新する時間がありません。
その結果、2件の注文が入る。
これは、1ミリ秒間のポーズをとることで解決します !
ただ、ポーズは万能ではないことを肝に銘じておいてください。
ただ、一時停止は万能ではないことを肝に銘じておいてください。
KimVのオーダーチェック機能は役に立たないのでしょうか?
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
チャンピオンシップの初日、私のExpert Advisorは意図したとおりに動作しないことがわかりました。つまり、単一の保留命令の代わりに、いくつかの一方向の保留命令を配置します。これはおおよそ次のような構造になっています。
質問:端末は、最初のブロックのOrderSend()関数が処理を終えるのを待つのか[つまり、リクエストを受信するのを待つのか]、それともサーバーに取引リクエストを送信 した後、すぐに次のオペレータ(ブロック)にパスするのでしょうか?