Domande di OrderSend()

 

Il primo giorno di campionato ha dimostrato che il mio Expert Advisor non funziona come previsto, cioè, invece di un singolo ordine pendente piazza diversi ordini pendenti unidirezionali. Questa è approssimativamente la seguente struttura:

bool flag_order=false;
...
if(OrderSend(request,result)) flag_order=true;  //из блока обработки (модификации) имеющихся отложенных ордеров
...
if(flag_order==false)                            //из блока выставления отложенных ордеров
  {
   ...
   OrderSend(request,result);
  }                                           
Domanda: il terminale aspetta che la funzione OrderSend() del primo blocco finisca l'elaborazione [cioè aspetta che la richiesta sia ricevuta], o passa immediatamente all'operatore successivo (blocco) dopo aver inviato una richiesta di compravendita al server?
 

Naturalmente controlleremo il vostro caso.

Ma in generale la funzione OrderSend funziona secondo l'aiuto.

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

In caso disuccesso del controllo di base delle strutture (controllo del puntatore) restituisce true - non indica la riuscita dell'esecuzione dell'operazione commerciale. Per ottenere una descrizione più dettagliata del risultato della funzione, dovremmo analizzare i campi della struttura delrisultato.

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

Naturalmente controlleremo il vostro caso.

Ma in generale, la funzione OrderSend funziona secondo la guida.

No, non mi sto lamentando, voglio solo capire. Forse ho sbagliato da qualche altra parte... Ho anche analizzato i campi della struttura dei risultati dove pensavo dovessero essere [come mi è stato insegnato :)] .

Ma da quanto ho capito, almeno si suppone che la transizione all'operatore successivo dovrebbe essere fatta solo dopo che il terminale gestisce completamente la funzione OrderSend() [compreso l'ottenimento e la gestione dei campi della struttura dei risultati]?

(Scusa, nella domanda precedente ho fatto un errore di battitura: ho specificato richiesta invece di risultato).

 
Yedelkin:

Il primo giorno di campionato ha dimostrato che il mio Expert Advisor non funziona come previsto, cioè, invece di un singolo ordine pendente piazza diversi ordini pendenti unidirezionali. Questa è approssimativamente la stessa struttura:

Domanda: il terminale aspetta che la funzione OrderSend() del primo blocco finisca l'elaborazione [cioè aspetta che la richiesta sia ricevuta], o passa immediatamente all'operatore successivo (blocco) dopo aver inviato una richiesta di compravendita al server?

Confermo il problema. Dopo aver impostato l'OrderSend() di un ordine in sospeso, OrdersTotal non sempre lo vede.

Ho impostato una pausa dopo OrderSend(). Ma non ha aiutato il robot al campionato di oggi :)

 

Buon pomeriggio a tutti.

Sto cercando di fare un programma che si limiti ad aprire un ordine in base al mercato, cioè mando un simbolo, un volume e un tipo di ordine, in un ciclo finché non appare una posizione con la direzione che voglio.

Il registro dà

2012.01.09 16:08:42 Trades '9066293' : fallito acquisto istantaneo 1.00 EURUSD a 0.0000 (deviazione: 103117312) [Stop non valido].

Quindi, se apro a mercato, perché devo specificare il prezzo di apertura? Non ho bisogno di fermate.

Io aprirei con F9.

Per favore, consigliatemi dove ho sbagliato o scrivete del codice per aprire un ordine.

Sto riempiendo la struttura con un tale minimo:

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 = "";
L'intero test di Expert Advisor per l'apertura di una posizione è nel file.
File:
 
awkozlov:

Buon pomeriggio a tutti.

Sto cercando di fare un programma che apra semplicemente un ordine a mercato. Cioè mando lì un simbolo, un volume e un tipo di ordine, in un ciclo finché non appare una posizione con la direzione che voglio.

E qualcosa mi dà = Invalid Stops, mentre non ho bisogno di alcuno Stops per un ordine a mercato. Non so dove sto sbagliando...

L'intero test dell'Expert Advisor per aprire una posizione è nel file.


Ecco qui, dovrebbe funzionare.

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

Ecco, dovrebbe funzionare.


Grazie. Funziona. E così velocemente che non ha il tempo di aggiornare le informazioni sulla posizione.

Di conseguenza, vengono effettuati 2 ordini.

Si può risolvere con una pausa di 1 millisecondo!


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

... non ha il tempo di aggiornare le informazioni sulla posizione.

Di conseguenza, vengono effettuati 2 ordini.

Questo può essere risolto con una pausa di 1 millisecondo!

Basta tenere a mente che la pausa non è una panacea:

 
Yedelkin:

Basta tenere a mente che la pausa non è una panacea:

La funzione di controllo degli ordini di KimV non aiuta?
 
-Alexey-:
La funzione di controllo degli ordini di KimV non aiuta?
Devo essermi perso un topic come questo. Dove posso trovare informazioni sulla funzione di verifica degli ordini di KimV?