Questions OrderSend()

 

Le premier jour du championnat a montré que mon Expert Advisor ne fonctionne pas comme prévu, à savoir qu'au lieu d'un seul ordre en attente, il place plusieurs ordres en attente unidirectionnels. Il s'agit approximativement de la structure suivante :

bool flag_order=false;
...
if(OrderSend(request,result)) flag_order=true;  //из блока обработки (модификации) имеющихся отложенных ордеров
...
if(flag_order==false)                            //из блока выставления отложенных ордеров
  {
   ...
   OrderSend(request,result);
  }                                           
Question : Le terminal attend-il que la fonction OrderSend() du premier bloc termine son traitement [c'est-à-dire qu'il attende la réception de la demande], ou passe-t-il immédiatement à l'opérateur (bloc) suivant après avoir envoyé une demande de transaction au serveur ?
 

Nous allons, bien sûr, vérifier votre dossier.

Mais en général, la fonction OrderSend fonctionne conformément à l'aide.

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

En cas desuccès du contrôle de base des structures (contrôle des pointeurs), il renvoie vrai - il n'indique pas l'exécution réussie de l'opération commerciale. Pour obtenir une description plus détaillée du résultat de la fonction, nous devons analyser les champs de la structure du résultat.

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

Nous allons, bien sûr, vérifier votre dossier.

Mais en général, la fonction OrderSend fonctionne conformément à l'aide.

Non, je ne me plains pas, je veux juste comprendre. Peut-être que je me suis trompé ailleurs... J'ai également analysé les champs de la structure du résultat là où je pensais qu'ils devaient être [comme on me l'a appris :)].

Mais si je comprends bien, il est au moins supposé que la transition vers l'opérateur suivant ne doit se faire qu'après que le terminal ait complètement traité la fonction OrderSend() [y compris la récupération et la manipulation des champs de la structure de résultat] ?

(Désolé, dans la question précédente j'ai fait une faute de frappe : j'ai spécifié request au lieu de resultat).

 
Yedelkin:

Le premier jour du championnat a montré que mon Expert Advisor ne fonctionne pas comme prévu, à savoir qu'au lieu d'un seul ordre en attente, il place plusieurs ordres en attente unidirectionnels. Il s'agit approximativement de la même structure :

Question : Le terminal attend-il que la fonction OrderSend() du premier bloc termine son traitement [c'est-à-dire attend-il la réception de la demande], ou passe-t-il immédiatement à l'opérateur (bloc) suivant après avoir envoyé une demande de transaction au serveur ?

Je confirme le problème. Après avoir défini l'OrderSend() d'un ordre en attente, OrdersTotal ne le voit pas toujours.

J'ai mis une pause après OrderSend(). Mais cela n'a pas aidé le robot au championnat aujourd'hui :)

 

Bonjour à tous.

J'essaie de créer un programme qui ouvrirait simplement un ordre en fonction du marché. C'est-à-dire que j'y envoie un symbole, un volume et un type d'ordre, dans une boucle jusqu'à ce qu'une position avec la direction que je veux apparaisse.

Le journal donne

2012.01.09 16:08:42 Trades '9066293' : échec de l'achat instantané de 1,00 EURUSD à 0,0000 (écart : 103117312) [Arrêts invalides].

Si j'ouvre au marché, pourquoi dois-je préciser le prix d'ouverture ? Je n'ai pas besoin d'arrêts.

J'ouvrirais par F9.

S'il vous plaît, dites-moi où j'ai fait une erreur ou écrivez un code pour ouvrir une commande.

Je remplis la structure avec un tel 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 = "";
Le test complet de l'Expert Advisor pour l'ouverture d'une position se trouve dans le fichier.
Dossiers :
 
awkozlov:

Bonjour à tous.

J'essaie de créer un programme qui ouvrirait simplement un ordre au marché. C'est-à-dire que j'y envoie un symbole, un volume et un type d'ordre, dans une boucle jusqu'à ce qu'une position avec la direction que je veux apparaisse.

Et quelque chose me donne = Stops invalides, alors que je n'ai pas besoin de Stops pour un ordre au marché. Je ne sais pas où je me trompe...

Le test complet de l'Expert Advisor pour ouvrir une position est dans le fichier.


Voilà, ça devrait marcher.

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

Voilà, ça devrait fonctionner.


Merci. Ça marche. Et si vite qu'il n'a pas le temps de mettre à jour les informations sur la position.

En conséquence, 2 commandes sont passées.

Cela peut être corrigé avec une pause d'une milliseconde !


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

... n'a pas le temps de mettre à jour les informations sur le poste.

En conséquence, 2 commandes sont passées.

Cela peut être résolu en faisant une pause d'une milliseconde !

Gardez simplement à l'esprit que la pause n'est pas une panacée :

 
Yedelkin:

Gardez à l'esprit que la pause n'est pas une panacée :

La fonction de vérification des commandes de KimV ne vous aidera pas ?
 
-Alexey-:
La fonction de vérification des commandes de KimV n'est-elle pas utile ?
J'ai dû manquer un sujet comme celui-ci. Où puis-je trouver des informations sur la fonction de vérification des commandes de KimV ?