[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 270

 

Veuillez regarder le code de l'EA, je n'arrive pas à comprendre la raison de ce problème..... Au premier démarrage, il peut ouvrir une transaction immédiatement, mais après la fermeture, il cesse de fonctionner jusqu'au prochain redémarrage du terminal ou jusqu'à ce qu'il permette à l'EA de trader.... Fonctionne avec l'indicateur Gann 2.0

extern string     s0                = "Setup: Main";
extern int        Magic             = 1121;
extern double     lots              = 0.1;
extern int        StopLoss          = 70;
extern int        TakeProfit        = 140;
extern bool       UseTrail          = true;
extern bool       TrailWhileMinus   = false;
extern int        Trail             = 70;

extern string     s1                = "Setup: GANN indicator";
extern bool UseBeginDate = false;
extern string BeginDate = "2010.01.01 00:00";
extern int nBarsBack = 120;//250;
extern string prices = "0=close, 4=median, 5=typical";
extern int Price_Mode = 5;
extern bool Show_GridMatrix = false;
extern bool Show_GannGrid = false;
extern bool Show_HiloArrows = true;
extern bool Show_PriceArrows = true;
extern bool Show_Comments = false;
extern string ____MainGrid____ = "ooo";
extern color MainGrid_Color = Silver;//Green;//Sienna;
extern int MainGrid_Style = STYLE_DOT;
extern int MinMaxGrid_Style = STYLE_SOLID;
extern int MainGrid_Width = 1;
extern int fontSize = 8;
extern bool Draw_AllGrids = false;
extern bool Draw_AdditionalGrids = false;
extern string ____GannGrid____ = "ttt";
extern color GannGrid_Color = Silver;//Gray;
extern int GannGrid_Style = STYLE_DOT;
extern int GannGrid_Width = 177;
extern string ____Default_GridParameters____ = "Recomanded GridInterval 35 or 36";
extern int MainGrid_Intervals = 3677;   //default=35(!)
extern double GannGrid_Interval = 8.0;//with default 8.5 is the time interval not OK; and 9 is too large
extern int Text_Shift = 50;

//s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift

int               slip              = 3;

int Ticket[1000];

void deinit() 
{
   SemaphoreDeinit("TRADECONTEXT");

   return(0);
}


int start()
{
   static datetime TimeFlag = 0;
   datetime        TimeLast = Time[0];
   if(TimeFlag < TimeLast)
   {
      TimeFlag = TimeLast;
      
      int GANN = GetSignal_GANN();
      
      AnalyzeSignals(GANN);
      
      if(UseTrail == true) TrailAllOrders();
   }
   return(0);
}



void AnalyzeSignals(int GANN)
{
   static int ticket = 0;
   int sig = -1;
   bool res;
   
   ticket = RefreshTicket(ticket);
   
   if(GANN == OP_BUY)
      sig = OP_BUY;
   else if(GANN == OP_SELL)
      sig = OP_SELL;   

   if(ticket != 0)
   {
      OrderSelect(ticket, SELECT_BY_TICKET);      
      int type = OrderType();
      
      if(sig == OP_BUY && type == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Ask, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      }
   
      else if(sig == OP_SELL && type == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         res = OrderClose(ticket, OrderLots(), Bid, slip);
         SemaphoreReturn("TRADECONTEXT");
         if(!res) {Alert("OrderClose Error: ", GetLastError());}
         else ticket = 0;
      } 
   }   
   
   
   if(ticket == 0)
   {   
      double _lot = lots;
   
      if(sig == OP_BUY)
      {
         SemaphoreTake("TRADECONTEXT"); 
         ticket = OrderSend(Symbol(), OP_BUY, _lot, Ask, slip, Bid - StopLoss*Point, Bid + TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   
      else if(sig == OP_SELL)
      {
         SemaphoreTake("TRADECONTEXT");
         ticket = OrderSend(Symbol(), OP_SELL, _lot, Bid, slip, Ask + StopLoss*Point, Ask - TakeProfit*Point, NULL, Magic);
         SemaphoreReturn("TRADECONTEXT");
         if(ticket < 0) {Alert("OrderSend Error: ", GetLastError());}
      }
   }
}

int RefreshTicket(int ticket)
{
   bool res;
   
   if(ticket <= 0)
      return(0);
   else
   {
      res = OrderSelect(ticket, SELECT_BY_TICKET);
      if(!res)
         return(0);
      else if(OrderCloseTime() != 0)
         return(0);
   }
   
   return(ticket);      //all ok, ticket still valid
}

int GetSignal_GANN()
{
   //Alert("!!: ", s1, ";", UseBeginDate, ";", BeginDate, ";", nBarsBack, ";", prices, ";", Price_Mode, ";", Show_GridMatrix, ";", Show_GannGrid, ";", Show_HiloArrows, ";", Show_PriceArrows, ";", Show_Comments, ";", ____MainGrid____, ";", MainGrid_Color, ";", MainGrid_Style, ";", MinMaxGrid_Style, ";", MainGrid_Width, ";", fontSize, ";", Draw_AllGrids, ";", Draw_AdditionalGrids, ";", ____GannGrid____, ";", GannGrid_Color, ";", GannGrid_Style, ";", GannGrid_Width, ";", ____Default_GridParameters____, ";", MainGrid_Intervals, ";", GannGrid_Interval, ";", Text_Shift);

   double ga_up = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          4, 0);
  
   double ga_dn = iCustom(NULL, 0, "Gann v2.0", s1, UseBeginDate, BeginDate, nBarsBack, prices, Price_Mode, Show_GridMatrix, Show_GannGrid, Show_HiloArrows, Show_PriceArrows, Show_Comments, ____MainGrid____, MainGrid_Color, MainGrid_Style, MinMaxGrid_Style, MainGrid_Width, fontSize, Draw_AllGrids, Draw_AdditionalGrids, ____GannGrid____, GannGrid_Color, GannGrid_Style, GannGrid_Width, ____Default_GridParameters____, MainGrid_Intervals, GannGrid_Interval, Text_Shift, 
                                          6, 0); 

   Print("ga_up = ", ga_up);
   Print("ga_dn = ", ga_dn);
   
   if(ga_up > 0.0)
      return(OP_BUY);
   else if(ga_dn > 0.0)
      return(OP_SELL);
   else
      return(-1);   
}


int TrailAllOrders()
{
   int i, total;
   
   total = CreateTicketArray(OP_BUY, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);

   total = CreateTicketArray(OP_SELL, Magic);
   for(i=0; i<total; i++)
      TrailingStop(Ticket[i]);
}

void TrailingStop(int ticket)
{
   int res;
   OrderSelect(ticket, SELECT_BY_TICKET);
   
   if(OrderType() == OP_BUY)
      if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа   
         if(Bid - OrderStopLoss() > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT"); 
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
        }
         
   if(OrderType() == OP_SELL)
      if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail)         //не тралим, пока не можем достичь безубытка первым переносом стопа
         if(OrderStopLoss() - Ask > Trail*Point)
         {
            SemaphoreTake("TRADECONTEXT");
            res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
            SemaphoreReturn("TRADECONTEXT");        
            if(res<0)
               Alert("TrailingStop OrderModify Error: ", GetLastError());
         }
}

int CreateTicketArray(int dir, int SysID)
{
   int total=OrdersTotal(), i, c=0; if (total<=0) return (0);
        for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } }
        return (c);
}

//------------------------------------------SEMAPHORE------------------------------------------

int critical = 0; 

void SemaphoreTake(string SEM)
{ 
   if(GlobalVariableCheck(SEM) == false)
      GlobalVariableSet(SEM, 0);
  
   while(1==1)
   {
      if(GlobalVariableSetOnCondition(SEM, 1.0, 0.0))         //получили доступ
      {
         critical = 1;
         Print("SEMAPHORE \"", SEM, "\" TAKEN. CURRENT VALUE: ", GlobalVariableGet(SEM));
         break;      //выходим из цикла ожидания доступа
      }
      else
      {
         Print("ATTEMPT TO CAPTURE SEMAPHORE \"", SEM, "\" FAILED. SEMAPHORE BUSY. WAITING 0.1 SEC. CURRENT VALUE: ", GlobalVariableGet(SEM));
         Sleep(100);
      }
   }
} 

void SemaphoreReturn(string SEM)
{
   GlobalVariableSet(SEM, 0.0);
   Print("SEMAPHORE \"", SEM, "\" RETURNED. CURRENT VALUE: ", GlobalVariableGet(SEM));
   critical = 0;
}

void SemaphoreDeinit(string SEM)    //Вставить в ф-ю  deinit()
{
   if(critical == 1)
   {
      GlobalVariableSet(SEM,      0.0);    //на случай, если советника убивают, пока он в процессе посылки запроса
   }  
}
 
chief2000:
Voici un exemple tiré de la documentation d'une commande qui vous aidera - comprenez comment elle fonctionne, modifiez les paramètres :

Haut [iHighest(NULL,0,MODE_HIGH,20,4)] ;
Low[iLowest(NULL,0,MODE_LOW,10,10)] ;


MERCI
 
chief2000:
Voici un exemple tiré de la documentation d'une commande qui vous aidera - comprenez comment elle fonctionne, modifiez les paramètres :

Haut [iHighest(NULL,0,MODE_HIGH,20,4)] ;
Low[iLowest(NULL,0,MODE_LOW,10,10)] ;


Désolé d'être en retard dans ma réponse, j'ai eu des problèmes avec mon ordinateur.
 
chief2000:
Voici un exemple tiré de la documentation d'une commande qui vous aidera - comprenez comment elle fonctionne, modifiez les paramètres :

Haut [iHighest(NULL,0,MODE_HIGH,20,4)] ;
Low[iLowest(NULL,0,MODE_LOW,10,10)] ;


Désolé d'être en retard dans ma réponse, j'ai eu des problèmes avec mon ordinateur.
 
al7bar:

Veuillez regarder le code de l'EA, je n'arrive pas à comprendre la raison de ce problème..... Au premier démarrage, il peut ouvrir une transaction immédiatement, mais après la fermeture, il cesse de fonctionner jusqu'au prochain redémarrage du terminal ou jusqu'à ce qu'il permette à l'EA de trader.... Fonctionne avec l'indicateur Gann 2.0

Aucune erreur de logique évidente. Veuillez imprimer le code étape par étape. La procédure de négociation est liée à la valeur de la variable ticket. Tout d'abord, retracez ses changements. Faites également attention à la valeur de la variable globale "TRADECONTEXT" - sa valeur doit être 0.
 
TarasBY:

Cette fonction vous permet d'obtenir des informations commerciales pour un instrument (sans les lier à un ordre, par exemple avant d'ouvrir un ordre) et les mêmes, mais en liaison avec un ordre spécifique (lorsqu'il l'accompagne). La valeur par défaut est utilisée pour faciliter l'utilisation de la fonction. La valeur négative de fi_Ticket est utilisée lors de l'initialisation de la bibliothèque commerciale.

P.S. Et d'abord, faites attention aux noms des variables, ou plus précisément à leurs préfixes. Les variables qui ont une initiale b, comme bs_Symbol, sont déclarées globalement à partir de la bibliothèque. La plupart des variables globales sont déclarées dans b-PSI@Base.


Igor, je comprends. Mais le fait est que, si je comprends bien, pour obtenir des informations sur le marché pour un symbole donné, il n'est pas nécessaire de le lier à un ordre. S'il y a un instrument, un ordre n'est pas nécessaire... Ce n'est pas du tout nécessaire. Après tout, il suffit de connaître le nom de l'instrument pour obtenir des informations sur le marché. Vous n'êtes pas d'accord ?

Cette variable dont je parlais,bs_Symbol, est mentionnée pour la première fois dans l'inclusion de b-PSY@Base.mqh, voici la chaîne :

  bs_Symbol,                            // текущий инструмент

Mais, rien ne lui est attribué. Ensuite :

if (fs_Symbol != bs_Symbol || fi_Ticket < 0)

Il y a une expression :

fs_Symbol != bs_Symbol

Il faut comprendre :fs_Symbol != 0 n'est-ce pas ?

TarasBY:

P.S. Et d'abord, faites attention aux noms des variables, ou plus précisément, à leurs préfixes. Les variables qui ont une initiale b, comme bs_Symbol, sont déclarées globalement à partir de la bibliothèque. La plupart des variables globales sont déclarées dans b-PSI@Base.


J'utilise habituellement g_ pour désigner les variables globales (du mot global). Utilisez-vous l(par exemple li_cnt) pour désigner les variables locales ?
 

Mes amis ! J'ai besoin d'aide pour peaufiner une EA.

Il y a un code qui ouvre une commande sous certaines conditions . L'exécution de la condition peut avoir lieu à chaque tick car elle est placée dans le corps de int start().

Nous avons besoin :

1. Après l'exécution d'une condition (et l'ouverture d'un ordre), nous devons faire une pause pour l'ouverture de nouveaux ordres, une pause de n barres. Par exemple, si mon conseiller expert est sur l'échelle de temps M30 et que j'ai besoin de passer 3 heures, alors la pause doit être de 6 barres.

2. Le programme devrait fonctionner dans le testeur de stratégie.

Quel code est nécessaire ? Et où serait le bon endroit pour l'insérer.

int start()
  { 
   ...

   if (...)                                                          //условие
      {
       OrderSend(Symbol(),OP_BUY,lot,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
       ...
      }

   ...
  }
 
hoz:


Igor, je comprends. Mais le fait est que, si je comprends bien, pour obtenir des informations sur le marché pour un instrument donné, il n'est pas du tout nécessaire de le lier à un ordre. S'il y a un instrument, un ordre n'est pas nécessaire... Ce n'est pas du tout nécessaire. Après tout, il suffit de connaître le nom de l'instrument pour obtenir des informations sur le marché. Vous n'êtes pas d'accord ?

Cette variable dont je parlais,bs_Symbol, est mentionnée pour la première fois dans l'inclusion de b-PSY@Base.mqh, voici la chaîne :

Mais, rien ne lui est attribué. Ensuite :

Il y a une expression :

Il faut comprendre :fs_Symbol != 0 n'est-ce pas ?


Hm. J'utilise habituellement g_ pour désigner les variables globales (du mot global) et l(par exemple li_cnt) pour désigner les variables locales ?

Tu as encore beaucoup à apprendre. Jusqu'à présent, vos hypothèses ne sont pas correctes. Mes fonctions peuvent servir différents objectifs en même temps (afin de réduire le code lui-même), en particulier fGet_MarketInfo(). Tout est pensé à plusieurs reprises et rien ne doit être changé !

Commencez, par exemple, par une expérience : déclarez une variable globale dans le corps de l'EA et essayez d'appeler cette variable à partir de la bibliothèque liée. Essayez de lier les résultats aux noms de variables dont le préfixe commence par b, par exemple bs_Symbole.

P.S. Je n'ai pas besoin d'être contrôlé : soit vous utilisez mes bibliothèques, soit vous ne le faites pas. Si quelque chose (une partie de ma bibliothèque) ne fonctionne pas correctement - faites-le moi savoir et je le corrigerai. Et de poser des questions - "Pourquoi cela fonctionne-t-il de cette façon ? - vous avez besoin de plus de connaissances, car "l'évidence n'est pas à la surface".

 
TarasBY:

Tu as encore beaucoup à apprendre. Jusqu'à présent, vos hypothèses ne sont pas vraies. Mes fonctions peuvent servir différents objectifs en même temps (afin de réduire le code lui-même), en particulier fGet_MarketInfo(). Tout est pensé à plusieurs reprises et rien ne doit être changé !

Je comprends ce qu'il y a là. Mais la raison pour laquelle il est mis en œuvre de cette façon n'est pas claire.

TarasBY:

Par exemple, commencez par une expérience : déclarez une variable globale dans le corps de l'EA et essayez d'appeler cette variable à partir de la bibliothèque liée. Essayez de lier les résultats aux noms de variables dont le préfixe commence par b, par exemple bs_Symbole.

De toute façon, vous ne pourrez pas utiliser vos bibliothèques dans leur forme originale, c'est-à-dire que tout y est lié. Chaque fonction sur un paquet d'autres...

TarasBY:

P.S. Je n'ai pas besoin d'être contrôlé : soit vous utilisez mes bibliothèques, soit vous ne le faites pas. Si quelque chose (une de mes bibliothèques) ne fonctionne pas correctement, faites-le moi savoir et je le réparerai. Et de poser des questions - "Pourquoi ça marche comme ça ? - vous avez besoin de plus de connaissances, car "l'évidence ne se trouve pas à la surface".

Je ne voulais pas le tester de quelque façon que ce soit... En fait, il ne fait aucun doute qu'il est écrit de manière très compétente. C'est juste que je ne comprends pas tout, c'est pourquoi j'ai dit que je ne pense pas... Je regarde, je pense... Mais je ne comprends pas tout. C'est pourquoi j'ai demandé.

P.S. Avec bs_Symbol, je ne comprends toujours pas.

 
hoz:

Je comprends ce qu'il y a là. Mais la raison pour laquelle il est mis en œuvre de cette façon n'est pas claire.

Chaque fonction de bibliothèque individuelle fait partie de l'ensemble, et une bibliothèque individuelle fait partie de l'ensemble de mes bibliothèques - sans cette prise de conscience, il est impossible de comprendre le code.

hoz:

De toute façon, vous ne pouvez pas utiliser vos bibliothèques dans leur forme originale, c'est-à-dire que tout y est lié. Chaque fonction sur le paquet des autres...

Et c'est là que vous avez tort. Avez-vous déjà réfléchi à la structure d'une EE "moyenne" ? Ce qui rend un EA individuel, ce sont les conditions de la stratégie (c'est-à-dire les conditions d'entrée et de sortie), et tout le reste est du code standard. La façon dont je crée les EA, y compris ceux basés sur les ordres : je prends un modèle (par exemple, un SAR, si un EA réseau est nécessaire) et j'y connecte une bibliothèque supplémentaire dans laquelle les conditions d'une nouvelle stratégie sont écrites (je la recrée).

hoz:

Je ne voulais en aucun cas le vérifier. De plus, il ne fait aucun doute que tout est écrit de manière très compétente. Je ne comprends pas tout, alors j'ai dit que je ne le pensais pas. Je regarde, je pense... Mais je ne comprends pas tout. C'est pourquoi j'ai demandé.

P.S. Avec bs_Symbol, je ne comprends toujours pas.

Pour comprendre la mise en œuvre, vous devez comprendre les données sources. Les bibliothèques ont été créées avec la possibilité de travailler avec n'importe quel instrument (forex) et les modes mono et multidevises, d'où l'introduction de la variable globale bs_Symbol, qui contient la valeur de l'instrument actuel.
Raison: