[ARCHIVE]Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 5. - page 207

 
Roger:

1. Vous ne pouvez pas ouvrir des ordres dans la fonction init() (dans le testeur de stratégie, cela fonctionnera toujours, mais pas dans la démo).

2. Lorsque vous clôturez des ordres, vous devez compter de la fin au début, et non l'inverse, comme dans votre cas.

Merci de votre réponse.
Dans ce cas, l'opérateur de boucle a été étudié dans le testeur, c'est pourquoi les ordres sont ouverts dans init() pour simplifier, cela ne se produit pas dans les EAs réels.
Un changement dans l'ordre de sélection des ordres conduit effectivement à la fermeture des ordres dans un tick (je donne le code du programme et le rapport du log du testeur ci-dessous).
Il semble étrange que MQL4 ne me permette pas de changer l'ordre de travail des ordres. Si vous savez pourquoi, veuillez me le dire, car selon la logique de travail d'un EA, je vais fermer les ordres exactement dans l'ordre où ils ont été ouverts.

Sincèrement. Shurkin.

Код программы.

//+------------------------------------------------------------------+
//|                                                     Poligon1.mq4 |
//|                                            21 февраля 2013 года. |
//|Тестирование оператора цикла for.                                 |
//+------------------------------------------------------------------+
#property copyright "21 февраля 2013 года."
#property link      ""
//+------------------------------------------------------------------+
//|Объявленные переменные                                            |
//+------------------------------------------------------------------+
int Mn=357;//Magic number
int i;//Показатель счётчика итераций
double PriTP;//TP серии
int Tick;//Счётчик тиков
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----Установка серии ордеров
OrderSend(Symbol(),OP_BUY,0.5,Ask,0,NormalizeDouble(Bid-35*Point,Digits),
NormalizeDouble(Ask+35*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1,Ask,0,NormalizeDouble(Bid-25*Point,Digits),
NormalizeDouble(Ask+25*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,1.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,2.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUY,3.5,Ask,0,NormalizeDouble(Bid-15*Point,Digits),
NormalizeDouble(Ask+15*Point,Digits),NULL,Mn,0,CLR_NONE);//OP_BUY
OrderSend(Symbol(),OP_BUYLIMIT,1,NormalizeDouble(Ask-15*Point,Digits),0,
NormalizeDouble(Bid-40*Point,Digits),NormalizeDouble(Ask+25*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_BUYLIMIT
OrderSend(Symbol(),OP_SELLSTOP,3,NormalizeDouble(Ask-30*Point,Digits),0,
NormalizeDouble(Bid+15*Point,Digits),NormalizeDouble(Ask-75*Point,Digits),
NULL,Mn,0,CLR_NONE);//OP_SELLSTOP
//----
   PriTP=Bid;//PriTP
   Print("Кс0:"," OrdersTotal=",OrdersTotal());//Сообщение
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Tick++;//Tick
//   Print("Кс1:"," Tick=",Tick);//Сообщение
//----
//   for(i=0;i<OrdersTotal();i++)//Инициализация цикла
   for(i=OrdersTotal()-1; i>=0; i--)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
//----
   return(0);
  }
//+------------------------------------------------------------------+
Записи в журнале тестера.

2013.03.08 13:28:19     Poligon1 EURUSD,M15: removed
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=0
2013.03.08 10:14:14     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=3 i=1
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=0
2013.03.08 10:13:50     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=2 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=0
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=1
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=2
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=3
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: close #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 at price 1.3395
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=4
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=5
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс2: Tick=1 i=6
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: Кс0: OrdersTotal=7
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #7 sell stop 3.00 EURUSD at 1.3367 sl: 1.3410 tp: 1.3322 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #6 buy limit 1.00 EURUSD at 1.3382 sl: 1.3355 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #5 buy 3.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #4 buy 2.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #3 buy 1.50 EURUSD at 1.3397 sl: 1.3380 tp: 1.3412 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #2 buy 1.00 EURUSD at 1.3397 sl: 1.3370 tp: 1.3422 ok
2013.03.08 10:13:26     2013.02.11 12:15  Poligon1 EURUSD,M15: open #1 buy 0.50 EURUSD at 1.3397 sl: 1.3360 tp: 1.3432 ok
2013.03.08 10:13:26     Poligon1 test started
2013.03.08 10:13:24     Poligon1 EURUSD,M15: loaded successfully

 
Merci beaucoup pour ces informations précieuses. Je vais certainement essayer de tenir compte de tout ce que vous m'avez dit à l'avenir.
 
borilunad:

Vous ne pouvez pas ouvrir exactement au prix du stop loss, mais vous pouvez conditionner l'ouverture dans la même direction ou dans la direction opposée !

Voici un appel de fonction tiré de "Useful Functions" de Kim, que vous pouvez placer dans une condition :

isCloseLastPosByStop - Retourne l'indicateur de fermeture de la dernière position par arrêt.

if(isCloseLastPosByStop() == 0) ou ... == 1) et ce que vous voulez ......

Vous pouvez trouver la fonction ici : https://www.mql5.com/ru/forum/131859

Et mettez-le en dehors du départ !

Et je vous en conjure, vous pouvez le faire tout seul, avec diligence, précision et patience, sinon vous n'apprendrez rien des indices !

La connaissance ne s'acquiert qu'au prix d'un effort suffisant de votre part ! Mettez-vous au travail quotidien de curiosité ! Bonne chance !


Merci beaucoup pour ces informations précieuses, je vais certainement essayer d'intégrer tout ce que vous m'avez dit à l'avenir.
 

Bonne journée.

Veuillez me dire s'il existe des situations où les CT peuvent modifier ou supprimer les commentaires d'une commande ?

Merci beaucoup.

 
Gek34:

Veuillez me dire s'il existe des situations où les CT peuvent modifier ou supprimer les commentaires d'une commande... ?

A titre d'exemple.
Commentaire natif
e121220_3in1 01

Avec DC ajouté après le roulement

e121220_3in1 01[swap]

Autrement dit, si nous recherchons un ordre comportant un commentaire, nous devons d'abord déterminer la longueur de la ligne de commentaire indigène, puis vérifier uniquement la première partie du commentaire modifié dans la longueur correspondante. Ou vérifiez si la chaîne native se trouve dans le commentaire à vérifier.

 

Shurkin:

Merci pour la réponse.
Dans ce cas, le travail de l'opérateur de boucle a été étudié exactement dans le testeur, c'est pourquoi les ordres sont ouverts dans init() pour la simplification, cela ne se produit pas dans les EA réels.
La modification de l'ordre des ordres entraîne en fait leur clôture en un tick (le code du programme et le rapport du journal du testeur sont donnés ci-dessous).
Il semble étrange que MQL4 ne me permette pas de sélectionner un ordre. Si vous savez pourquoi, veuillez m'en informer, car la logique de travail du conseiller expert suggère que les ordres doivent être fermés exactement dans l'ordre où ils sont ouverts.

Sincèrement. Shurkin.



La logique est correcte - les numéros d'ordre des commandes devraient être les mêmes que ceux des commandes. Une fois qu'une commande est fermée, toutes les autres sont recalculées. Essayez cette construction

 for(i=0, int k=0; i<OrdersTotal();i++,k++)//
   {
   Print("Кс2:"," Tick=",Tick," i=",i);//Сообщение
   if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)//Выбор ордера i
    {
   if(OrderSymbol()==Symbol())//Символ
     {
   if(OrderMagicNumber()==Mn)//Идентификационное число
      {
   if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)//Тип операции текущего выбранного ордера
       {
   OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);//Закрытие позиции
   k--;
       }//Закрыто if(OrderType()==OP_BUY && OrderTakeProfit()>PriTP)
      }//Закрыто if(OrderMagicNumber()==Mn)
     }//Закрыто if(OrderSymbol()==Symbol()
    }//Закрыто if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
   }//Закрыто for(i=0;i<OrdersTotal();i++)
 
Gek34:

Bonne journée.

Veuillez me dire s'il existe des situations où les CT peuvent modifier ou supprimer les commentaires d'une commande ?

Merci beaucoup.


Nous avons fait l'expérience d'un changement complet de commentaire sur une commande. De plus, la magie est parfois mise à zéro pendant les fermetures partielles (les fermetures partielles sont initiées par le serveur). Désormais, il existe un conseiller distinct, en boucle, pour contrôler ce dernier, qui surveille les ordres "étrangers" et autres incohérences, et les notifie par des messages Push en temps utile.
 

Veuillez me dire comment écrire la condition correctement :

1.si ordre symbole = symbole et ordre magik = 135

2.s'il n'y a pas d'ordre BAYSTOP en attente.

3.s'il n'y a pas d'ordres ouverts BAY OU (s'il y en a) stoploss>prix ouvert

4.si le prix est entre la MA et la fractale vers le haut

PLACER UN ORDRE D'ACHAT STOP EN ATTENTE

ÉCRIT COMME ÇA :

 static bool flag ;

   if(NewBar()==true)

     flag = true; 

     for(int i=0;i<total-1;i++) 

         {

         OrderSelect(i,SELECT_BY_POS); 

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==135) 

          { 

          if(OrderType()<=OP_BUYSTOP) 

           {

           if((OrderType()<=OP_BUY) || (OrderType()==OP_BUY && OrderStopLoss()>OrderOpenPrice()))  

            { 

            if(Ask<m && Ask>ma && frUP>0 && flag)

            {

              double price = NormalizeDouble(frUP+30*Point+(Ask-Bid)*Point,Digits);

             double stoploss = NormalizeDouble(price-sl*Point-30*Point,Digits);

             double takeprofit = NormalizeDouble(price+tp*Point,Digits);

             int ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,price,5,stoploss,takeprofit,"R",135,TimeCurrent()+55000,Blue);

             if(ticket>0)

               {

               Alert("R!Отложенный ордер BUYSTOP!!! ",Symbol());

               flag = false;

               }

               else

               {

               Print("Lots= ", Lots,"price= ", price,"stoploss= ", stoploss,"takeprofit= ", takeprofit,"Ошибка № ",GetLastError());      

               return;

               }

             }

           }

         }

       }

     } 

NE FONCTIONNE PAS ! DITES-MOI QUELLE EST L'ERREUR !

 

Veuillez me dire ce qui pourrait causer le problème suivant.

Il existe un indicateur qui utilise des fonctions externes. Le code de la bibliothèque compilée est situé dans le dossier des bibliothèques, les descripteurs - dans include.

Connexion #include <lib_Zemckikh.mqh>. Lors de la première exécution de l'indicateur, toutes les fonctions de la bibliothèque fonctionnent normalement, l'indicateur est affiché sur le graphique. Après un changement de paramètres (après un nouveau calcul de l'indicateur), les fonctions de la bibliothèque ne sont pas appelées, l'indicateur n'est pas affiché, il n'y a pas d'entrées dans l'onglet "Experts" après le changement de paramètres.

Si vous excluez la connexion de la bibliothèque et placez les fonctions requises dans le fichier indicateur (compilé directement avec les fonctions), tout fonctionne bien.

Je ne comprends pas ce qui ne va pas. Je ne veux pas polluer le forum, je ne joins pas les codes. Si vous en avez besoin, je vous l'enverrai en personne.

 

Bonsoir à tous !

Quelle fonction renvoie l'heure de fixation du dernier ordre en suspens (c'est-à-dire pas la transformation d'un ordre en suspens en un ordre au marché, mais l'heure de fixation d'un ordre en suspens) ?

J'ai examiné attentivement toutes les fonctions de Kim, mais je ne pense pas qu'il dispose d'une telle fonction.

Merci.