Fragen zu OrderSend()

 

Der erste Tag der Meisterschaft hat gezeigt, dass mein Expert Advisor nicht wie beabsichtigt funktioniert, nämlich statt einer einzigen schwebenden Order mehrere unidirektionale schwebende Orders platziert. Dies entspricht ungefähr der folgenden Struktur:

bool flag_order=false;
...
if(OrderSend(request,result)) flag_order=true;  //из блока обработки (модификации) имеющихся отложенных ордеров
...
if(flag_order==false)                            //из блока выставления отложенных ордеров
  {
   ...
   OrderSend(request,result);
  }                                           
Frage: Wartet das Terminal darauf, dass die OrderSend()-Funktion des ersten Blocks die Verarbeitung abschließt (d. h. auf den Eingang der Anfrage wartet), oder geht es sofort zum nächsten Operator (Block) über, nachdem es eine Handelsanfrage an den Server gesendet hat?
 

Selbstverständlich werden wir Ihren Fall prüfen.

Im Allgemeinen funktioniert die OrderSend-Funktion jedoch gemäß der Hilfe.

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

Beierfolgreicher Basisprüfung der Strukturen (Zeigerprüfung) wird true zurückgegeben - dies bedeutet nicht, dass die Handelsoperation erfolgreich ausgeführt wurde. Um eine genauere Beschreibung des Ergebnisses der Funktion zu erhalten, sollten wir die Felder der Ergebnisstruktur analysieren .

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

Selbstverständlich werden wir Ihren Fall prüfen.

Im Allgemeinen funktioniert die Funktion OrderSend jedoch wie in der Hilfe beschrieben.

Nein, ich beschwere mich nicht, ich möchte nur verstehen. Vielleicht habe ich irgendwo anders Mist gebaut... Ich habe auch die Felder der Ergebnisstruktur dort analysiert, wo sie meiner Meinung nach hingehören [wie mir beigebracht wurde :)].

Aber so wie ich es verstehe, sollte zumindest der Übergang zum nächsten Operator erst erfolgen, nachdem das Terminal die Funktion OrderSend() vollständig verarbeitet hat [einschließlich der Abfrage und Verarbeitung der Felder der Ergebnisstruktur]?

(Entschuldigung, in der vorherigen Frage habe ich einen Tippfehler gemacht: Ich habe Anfrage statt Ergebnis angegeben).

 
Yedelkin:

Der erste Tag der Meisterschaft hat gezeigt, dass mein Expert Advisor nicht wie beabsichtigt funktioniert, nämlich statt einer einzigen schwebenden Order mehrere unidirektionale schwebende Orders platziert. Dies ist ungefähr die gleiche Struktur:

Frage: Wartet das Terminal darauf, dass die OrderSend()-Funktion des ersten Blocks die Verarbeitung abschließt (d. h. auf den Eingang der Anfrage wartet), oder wechselt es sofort zum nächsten Operator (Block), nachdem es eine Handelsanfrage an den Server gesendet hat?

Ich bestätige das Problem. Nach dem Setzen von OrderSend() eines schwebenden Auftrags sieht OrdersTotal diesen nicht immer.

Ich setze eine Pause nach OrderSend(). Aber das hat dem Roboter heute bei der Meisterschaft nicht geholfen :)

 

Guten Tag an alle.

Ich versuche, ein Programm zu erstellen, das einfach einen Auftrag entsprechend dem Markt öffnet, d.h. ich sende ein Symbol, ein Volumen und einen Auftragstyp in einer Schleife, bis eine Position mit der gewünschten Richtung erscheint.

Das Protokoll gibt an

2012.01.09 16:08:42 Trades '9066293' : fehlgeschlagener Sofortkauf 1.00 EURUSD zu 0.0000 (Abweichung: 103117312) [Ungültige Stops].

Wenn ich also am Markt eröffne, warum muss ich dann den Eröffnungskurs angeben? Ich brauche keine Haltestellen.

Ich würde mit F9 öffnen.

Bitte weisen Sie mich darauf hin, wo ich einen Fehler gemacht habe, oder schreiben Sie einen Code zum Öffnen einer Bestellung.

Ich fülle die Struktur mit einem solchen Minimum:

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 = "";
Der gesamte Expert Advisor-Test zur Eröffnung einer Position ist in der Datei enthalten.
Dateien:
 
awkozlov:

Guten Tag an alle.

Ich versuche, ein Programm zu erstellen, das einfach eine Marktorder öffnet, d.h. ich sende ein Symbol, ein Volumen und einen Ordertyp in einer Schleife, bis eine Position mit der gewünschten Richtung erscheint.

Und irgendetwas gibt mir = Ungültige Stops, während ich keine Stops für eine Marktorder brauche. Ich weiß nicht, was ich falsch mache...

Der gesamte Test des Expert Advisors zur Eröffnung einer Position befindet sich in der Datei.


Bitte sehr, es sollte funktionieren.

//+------------------------------------------------------------------+
//|                                                         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:

So, das sollte funktionieren.


Ich danke Ihnen. Es klappt. Und zwar so schnell, dass sie keine Zeit hat, die Positionsdaten zu aktualisieren.

Infolgedessen werden 2 Aufträge erteilt.

Es kann mit einer Pause von 1 Millisekunde behoben werden!


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

... keine Zeit hat, die Positionsdaten zu aktualisieren.

Infolgedessen werden 2 Aufträge erteilt.

Dies kann mit einer 1-Millisekunde-Pause gelöst werden!

Denken Sie aber daran, dass die Pause kein Allheilmittel ist:

 
Yedelkin:

Denken Sie nur daran, dass Pausen kein Allheilmittel sind:

Die Auftragsprüfung von KimV hilft nicht?
 
-Alexey-:
Hilft die Auftragsprüfungsfunktion von KimV nicht?
Ich muss ein Thema wie dieses übersehen haben. Wo kann ich mich über die Auftragsprüfung bei KimV informieren?
Grund der Beschwerde: