Fragen zu OrderSend() - Seite 3

 
 komposter:

Die Abrechnung von Aufträgen im MT5 ist eine Wissenschaft für sich:Behandlung von Handelsereignissen im Expert Advisor mit der Funktion OnTrade()

Keine Pause bewahrt Sie vor dem erneuten Öffnen, es kann immer eine Situation eintreten, in der der Auftrag 1 Sekunde länger zur Ausführung benötigt.

ps: Und vergessen Sie nicht die Magie.

Der Ermöglicher?

Keine noch so gute Wissenschaft kann Sie vor den Machenschaften des globalen Meth

der globalen Meta-Phobie.

Versuchen Sie

 
her.human:
Nachdenken , bevor man etwas schreibt, gehört zum guten Ton.
 

Leider hat der MT5 viel mehr Fallen als der MT4.

Das Problem der verzögerten Datenaktualisierung nach erfolgreicher Ausführung vonOrderSend() wird in der allerletzten Zeile des folgenden Beispiels gelöst:

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);}}   

Funktion aktualisieren:

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

Bitte sehr, es sollte funktionieren.


//+------------------------------------------------------------------+
//|                                                         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;
  }
//+------------------------------------------------------------------+

In diesem tollen Code hat alles gut funktioniert,

aber die Programmiersprache hat sich geändert.

mql5 wurde entfernt.

ORDER_FILLING_AON;

Und jetzt funktioniert die Zusammenstellung an diesem Ort nicht mehr.

Können Sie mir sagen, wie ich die Struktur jetzt richtig ausfüllen kann?

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

In diesem wunderbaren Code funktionierte alles einwandfrei,

aber es gab eine Änderung in der Programmiersprache.

mql5 wurde entfernt

Die Antwort finden Sie hier: https: //www.mql5.com/ru/forum/6343/page8#comment_189991. Ja, sie haben diesen Punkt übersehen und ihn aus irgendeinem Grund nicht in den Ankündigungen erwähnt.
 

Vielen Dank, Rosh!

Allerdings habe ich das geändert - in "nehmen, was verfügbar ist", da ich einen aggressiven Flip habe, der wahrscheinlich nicht passieren wird.

Ich bin wirklich neugierig, welche Werkzeuge die Entwickler mit den primären Akronymen in russischer oder importierter Transkription gemeint haben.

Nur so aus Neugier, wie wurden die 2 Varianten verbal impliziert?

 
awkozlov:

Nur so aus Neugier, wie wurden die 2 Optionen mündlich impliziert?

  • ORDER_FILLING_AON - Ein Geschäft kann nur in dem angegebenen Volumen und zu einem Preis ausgeführt werden, der gleich oder besser ist als der im Auftrag angegebene. Wenn für das Auftragssymbol derzeit kein ausreichendes Volumen an Angeboten auf dem Markt vorhanden ist, wird der Auftrag nicht ausgeführt.
  • ORDER_FILLING_CANCEL - Eine Vereinbarung zur Ausführung eines Geschäfts mit dem maximal auf dem Markt verfügbaren Volumen innerhalb des im Auftrag angegebenen Volumens und zu einem Preis, der gleich oder besser als der im Auftrag angegebene ist. In diesem Fall werden keine zusätzlichen Bestellungen für das fehlende Volumen aufgegeben.
  •  

    Da es für einen Marktauftrag zwei Ausführungsgrundsätze geben kann, ORDER_FILLING_FOK und ORDER_FILLING_IOC, ist es sinnvoll, das Feld request.type_filling in der Handelsanfrage wie folgt auszufüllen:

    request.type_filling=ORDER_FILLING_FOK | ORDER_FILLING_IOC
    Der Compiler erzeugt nur die Warnung: implizite enum conversion. Reicht das aus, damit die Anfrage unabhängig von der Ausführungspolitik des Brokers/Händlers korrekt bearbeitet wird?
     
    Yedelkin:
    Der Compiler erzeugt nur die Warnung: implizite enum conversion. Reicht das aus, damit die Anfrage unabhängig von der Ausführungspolitik des Brokers/Händlers korrekt bearbeitet wird?

    Das ist wie "schwarzer Kaffee und Milch" - zwei sich gegenseitig ausschließende Politiken. Hier sind weitere Links auf Englisch:

    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:

    Da wir zwei Ausführungsstrategien für einen Marktauftrag haben können, ORDER_FILLING_FOK und ORDER_FILLING_IOC,

    Das bedeutet, dass Sie zwischen den beiden Optionen wählen können.