OrderSend() の質問 - ページ 3

 
 komposter:

MT5での注文の会計処理は科学そのもの:OnTrade()関数を使用してExpert Advisorで取引イベントを処理 する

一時停止しても再開の手間が省けるわけではなく、注文の実行に1秒かかるという状況が常に起こり得ます。

ps: そして、魔法も忘れてはいけません。

イネーブラー?

いくら科学でも、地球規模のメスの 手口からは救われない

グローバル・メタ・フォビアの

トライアル

 
her.human:
投稿する前に 考えるのが良いスタイルとされています。
 

残念ながら、MT5にはMT4よりも多くのトラップがあります。

OrderSend() の実行が成功した後に、データの更新が遅れる問題は、次の例の一番最後の行で解決します。

MqlTradeRequest request;
MqlTradeResult result;
...
OrderSend(request,result);
...
Ticket=false;
Error==result.retcode;
if(Error==10008 || Error==10009){Ticket=true;}
...
if(Ticket==true){while(!HistoryDealSelect(result.deal)){RefreshRates();Sleep(1);}}   

アップデート機能。

bool RefreshRates()
  {
   MqlTick tick;
   return(SymbolInfoTick(Symbol(),tick));
  }
 
sergey1294:

ほら、うまくいくはずだ。


//+------------------------------------------------------------------+
//|                                                         Deal.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://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;
  }
//+------------------------------------------------------------------+

この素晴らしいコードでは - すべてがうまくいきました。

が、プログラミング言語が変更になりました。

mql5 は削除されました。

ORDER_FILLING_AON;

そして今、この場所でコンパイルがうまくいかない。

今、構造を正しく記入する方法を教えてください。

// заполняем структуру
   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);
 
awkozlov:

この素晴らしいコードでは - すべてがうまくいきました。

が、プログラム言語に変更があった。

mql5 は削除されました。

答えはここにある -https://www.mql5.com/ru/forum/6343/page8#comment_189991.そう、この点を見逃して、なぜかアナウンスで発表しなかったのです。
 

Roshさん、どうもありがとうございます。

とはいえ、ありそうでなかったアグレッシブなフリップができたので、「使えるものは使ってみよう」と変更しました。

本当に不思議なのですが、開発者はロシア語や輸入転写の主要な略語で、どんなツールを意味していたのでしょうか?

ちなみに、2つのバリエーションはどのように表現されたのでしょうか?

 
awkozlov:

ちなみに、この2つの選択肢は、どのような意味合いを持っていたのでしょうか?

  • ORDER_FILLING_AON - 取引は、指定された数量と、注文で指定された価格と同等かそれ以上の価格でのみ執行されます。注文シンボルに対する十分な量のオファーがその時点で市場に存在しない場合、その注文は執行されません。
  • ORDER_FILLING_CANCEL - 注文で指定された数量の範囲内で、市場で入手できる最大の数量で、かつ注文で指定された価格と同等かそれ以上の価格で取引を執行するための契約。この場合、欠巻分の追加注文はありません。
  •  

    成行注文にはORDER_FILLING_FOKとORDER_FILLING_IOCという 2つの執行方針が あり得るので、 取引依頼のrequest.type_fillingフィールドには以下のように記入するのが適切 でしょうか?

    request.type_filling=ORDER_FILLING_FOK | ORDER_FILLING_IOC
    コンパイラは、「暗黙のenum変換」という警告を生成するだけです。ブローカー/ディーラーが設定した実行ポリシーに関係なく、リクエストが正しく処理されるにはそれで十分でしょうか?
     
    Yedelkin:
    コンパイラは、「暗黙のenum変換」という警告を生成するだけです。ブローカー/ディーラーが設定した実行ポリシーに関係なく、リクエストが正しく処理されるにはそれで十分でしょうか?

    ブラックコーヒーとミルク」みたいなもので、互いに相容れない方針です。以下、英語でのリンクです。

    Fill Or Kill (FOK) Definition | Investopedia
    Fill Or Kill (FOK) Definition | Investopedia
    • www.investopedia.com
    A type of time-in-force designation used in securities trading that instructs a brokerage to execute a transaction immediately and completely or not at all. This type of order is most likely to be used by active traders and is usually for a large quantity of stock. The order must be filled in its entirety or canceled (killed). The purpose of a...
     
    Yedelkin:

    成行注文にはORDER_FILLING_FOKとORDER_FILLING_IOCという 2つの執行方針が あるためです。

    つまり、2つの選択肢を選ぶことができるのです。