OrderSend() の質問

 

チャンピオンシップの初日、私のExpert Advisorは意図したとおりに動作しないことがわかりました。つまり、単一の保留命令の代わりに、いくつかの一方向の保留命令を配置します。これはおおよそ次のような構造になっています。

bool flag_order=false;
...
if(OrderSend(request,result)) flag_order=true;  //из блока обработки (модификации) имеющихся отложенных ордеров
...
if(flag_order==false)                            //из блока выставления отложенных ордеров
  {
   ...
   OrderSend(request,result);
  }                                           
質問:端末は、最初のブロックのOrderSend()関数が処理を終えるのを待つのか[つまり、リクエストを受信するのを待つのか]、それともサーバーに取引リクエストを送信 した後、すぐに次のオペレータ(ブロック)にパスするのでしょうか?
 

もちろん、お客様のケースを確認させていただきます。

しかし、一般的にOrderSend関数は ヘルプに従って動作します。

Возвращаемое значение

構造体の基本チェック(ポインタチェック)に成功した場合、true を返しますが 、これは取引操作の成功 は意味しません。関数の結果をより詳細に 知るためには、結果構造のフィールドを分析 する必要がある

Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 
alexvd:

もちろん、お客様のケースを確認させていただきます。

しかし、一般的にはOrderSend 機能はヘルプにしたがって動作します。

いや、文句を言ってるんじゃなくて、理解したいだけなんです。もしかしたら、どこかで失敗したのかもしれない...。また、リザルトストラクチャーの フィールドがあるべき場所にあることを分析しました(教えられたとおり です)。

しかし、私の理解では、少なくとも、端末がOrderSend()関数(結果構造体のフィールドの取得と処理を含む)を完全に処理した後にのみ、次の演算子への移行が行われるはず なのですが?

(すみません、前の質問でresultの代わりにrequestを指定してしまいました)。

 
Yedelkin:

チャンピオンシップの初日、私のExpert Advisorは意図したとおりに動作しないことがわかりました。つまり、単一の保留命令の代わりに、いくつかの一方向の保留命令を配置します。これは、ほぼ同じ構造です。

質問:端末は、最初のブロックのOrderSend()関数が処理を終えるのを待つのか[つまり、リクエストを受信するのを待つ]、それとも、サーバーに取引リクエストを送信 した後、すぐに次のオペレータ(ブロック)に切り替わるのでしょうか?

問題を確認する。保留中の注文のOrderSend()を設定した後、OrdersTotalが常にそれを見ているとは限りません。

OrderSend()の後に一時停止を設定しました。でも、今日のチャンピオンシップではロボットの役には立ちませんでしたが......)

 

こんにちは、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のテストは、すべてこのファイルにあります。
ファイル:
 
awkozlov:

こんにちは、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;
  }
//+------------------------------------------------------------------+
 
sergey1294:

これで、うまくいくはずです。


ありがとうございます。効いてますね。しかも、ポジション情報を更新する暇もないほどの速さで。

その結果、2件の注文が入る。

1ミリ秒の休止で直る !


   if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена
     {
Sleep (1);
       Alert("Купили!");
     }
   else Alert("Не купили....");
  }
 
awkozlov:

...は、ポジション情報を更新する時間がありません。

その結果、2件の注文が入る。

これは、1ミリ秒間のポーズをとることで解決します !

ただ、ポーズは万能ではないことを肝に銘じておいてください。

 
Yedelkin:

ただ、一時停止は万能ではないことを肝に銘じておいてください。

KimVのオーダーチェック機能では対応できない?
 
-Alexey-:
KimVのオーダーチェック機能は役に立たないのでしょうか?
こんな話題は見逃していたようです。キムVの注文確認機能については、どこで確認することができますか?
理由: