apprenez comment gagner de l'argent avec les villageois [Episode 2] ! - page 102

 

Salutations.

peut-être que quelqu'un est familier avec ce code :

//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям

datetime 
Time_at_History_Current = 0,
Time_at_History_Previos = 0;     
 
 if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0)
                  break;
               }
            }
         }
      }
   }

if (Sum_Loss < 0.0) { // Имеем убыток по закрытым позам
double money = Lots;
   BuyLots = GetBuyLotsSum();
        SellLots = GetSellLotsSum();
        if(BuyLots  > SellLots)money = BuyLots * 10;
        if(BuyLots  < SellLots)money = SellLots * 10;
  if (((AccountEquity() + Sum_Loss + (Sum_Loss / money)) >= AccountBalance()) && (((totalSell > 0) && (totalBuy < 1)) || ((totalSell < 1) && (totalBuy > 0)))) { // Достигли безубытка
    // Здесь какой-то код, который необходимо выполнить при достижении безубытка
        CloseAllBuy();
           CloseAllSell();
           Sum_Loss = 0.0;
           

je n'arrive pas à changer ceci : quand une affaire a été clôturée en négatif, la boucle est ouverte et si la prochaine commande est clôturée au-dessus de zéro, c'est à dire un solde positif, mais inférieur au négatif, on ajoute le plus au négatif et on obtient une nouvelle valeur négative, qui est déjà inférieure.

if(OrderProfit() >= 0 && Sum_Loss < 0.0)
                  double lastLoss_two = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss_two;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
               }

S'il est plus négatif, selon le signal, nous fermons l'ordre et recommençons le cycle depuis le début.

 
belck:

Bonjour.

Peut-être que quelqu'un connaît ce code :

Oui. C'est mon code. Je vous ai déjà écrit que je l'utilise dans ma martin de retournement comme suit :

Si la dernière transaction (pose) a été clôturée en profit, alors nous mettons à zéro le nombre de flips (itération) et nous commençons avec le lot de départ, s'il est négatif,

puis compter le nombre de trades perdants consécutifs et ouvrir dans la direction opposée avec un volume accru.

Il s'agit d'une version netting d'Avalanche (voir la branche du même nom ), c'est-à-dire que l'ordre de marché est fermé (lors du renversement d'une position sur des volumes plus importants) et l'ordre de marché opposé est ouvert sur des volumes plus importants en fonction du schéma d'action. Voici ma partie du code qui fonctionne. Modifiez-le en fonction de vos besoins si vous disposez d'un algorithme d'exp similaire. Je ne comprends rien à votre question. Vous pouvez poser vos questions indépendamment de la situation dans la section "Questions pour les débutants...", mais précisez votre question, car rien (du moins pour moi) n'est clair - du tout.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  Iteration = 0; // зануляем инерации перед их учетом в цикле по истории
  Sum_Loss = 0;  // суммарный убыток по этим итерациям
  datetime 
  Time_at_History_Current = 0,
  Time_at_History_Previos = 0;      
  if(OrdersHistoryTotal() != 0)
   {
    for(int counter = OrdersHistoryTotal()-1; counter >= 0; counter--)
      {
       OrderSelect(counter, SELECT_BY_POS, MODE_HISTORY);
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
          if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
             if(OrderProfit() < 0) // если убыток по выбранному ордеру, то считаем суммарный и записываем время закрытия ордера
                                   // для последующего его анализа при подсчете количества итераций
                {
                 double lastLoss = OrderProfit();
                 Sum_Loss=Sum_Loss+lastLoss;  // считаем общий убыток по закрытым подряд убыточным ордерам
                 Time_at_History_Current = OrderCloseTime();
                } 
             
             //Print(" Time_at_History_Current_в цикле = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS));
             //Print(" Time_at_History_Previos_в цикле = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
             
             if(Time_at_History_Current != Time_at_History_Previos) // если они не равны, то считаем итерации и делаем их равными
               {
                Time_at_History_Previos = Time_at_History_Current ;
                Iteration++;              
                //Print("Iteration at History в условии сравнения  = ",  Iteration);
               }   
             else // они равны, то проверяем, дополнительно, наличие профита по выбранному следующему ордеру и выходим из цикла
               {
                if(OrderProfit() >= 0) 
                  break;
               }
            }
         }
      }
   }
 //Print("Iteration at History = ",  Iteration, " Time_at_History_Current = ", TimeToStr(Time_at_History_Current, TIME_DATE|TIME_SECONDS),
 //      " Time_at_History_Previos = ", TimeToStr(Time_at_History_Previos, TIME_DATE|TIME_SECONDS));
       
    //-----------------------------------------------------расчет динамического канала----------------------------    
    if (Symbol() == "GBPJPY" || Symbol() == "EURJPY" || Symbol() == "USDJPY" || Symbol() == "CHFJPY" ||  Symbol() == "NZDJPY")  
      // || Symbol() == "XAUUSD" || Symbol() == "XAGUSD" || Symbol() == "EURGBP")   StopLossPips = StopLoss;    // т.к. волатильность (по АТР) другая (выше)
         {                 
           channel = (iATR(Symbol(),PERIOD_D1,Period_ATR,1)*1000)*Mul_Sl;                 
           StopLossPips = NormalizeDouble(channel,0);                                                                                                         
         }       
    else
         {                 
           channel = 10* (iATR(Symbol(),PERIOD_D1,Period_ATR,1)*10000/3)*Mul_Sl;                 
           StopLossPips = NormalizeDouble(channel,0);                                                                                                         
         }               
   TakeProfitPips=NormalizeDouble(StopLossPips*Mul_TP,0);  // расчет уровня тейка для всех инструментов по заданному значению динамического стопа        
                          
   // ------------------------------------------------Ищем наш ордер---------------------------------
   int orderType;
   for (int orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
   {
      if (!OrderSelect(orderIndex, SELECT_BY_POS))     continue; // если ордер не выбран, то идем на следующий открытый
      if(OrderCloseTime()!=0) continue;                    // если тикет принадлежит закрытому ордеру, то берем следующий открытый
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL)) continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера          
          if (ticket>0)                                    // Если позиция открылась
              {
                while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                Sleep(100);                                 
                double OpenPrice=OrderOpenPrice();
       // Print("OrderTicket()=",OrderTicket(),  "OrderOpenTime()=",OrderOpenTime()); 
       // Print("TimeLocal()=",TimeLocal());                                                                    
                     //---------------------Запоминаем значения сл и тп ордера                     
                if (orderType == OP_BUY) 
                   {                
                     V_StopLossPips = NormalizeDouble(OpenPrice  - (StopLossPips * Point), Digits);
                     V_TakeProfitPips = NormalizeDouble(OpenPrice + (TakeProfitPips * Point), Digits);
                   }
            
                if (orderType == OP_SELL) 
                   {        
                     V_StopLossPips = NormalizeDouble(OpenPrice  + (StopLossPips * Point), Digits);
                     V_TakeProfitPips = NormalizeDouble(OpenPrice - (TakeProfitPips * Point), Digits);
                   }   
                            
              }
             
     // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(MagicNumber);
         IsExpertFailed = true;
         return (0);
      }
    
       // Проверка закрытия открытой позиции (ордера) по стоп-лоссу           
      if ( V_StopLossPips != 0 )
        {
          if (orderType == OP_BUY && Bid <=  V_StopLossPips)  { CloseAllOrders(MagicNumber); Print ("V_StopLossPips закрываем по сл = ", V_StopLossPips); }             
          if (OrderType()== OP_SELL && Ask >=  V_StopLossPips){ CloseAllOrders(MagicNumber); Print ("V_StopLossPips закрываем по сл = ", V_StopLossPips); }  
        }         
        
        // Проверка закрытия открытой позиции (ордера) по тейку        
        if ( V_TakeProfitPips != 0 && MathAbs(orderProfit) > MathAbs (Sum_Loss))
        {
          if (orderType == OP_BUY && Bid >=  V_TakeProfitPips)  { CloseAllOrders(MagicNumber); Print ("V_TakeProfitPips закрываем по ТР = ", V_TakeProfitPips); }             
          if (OrderType()== OP_SELL && Ask <=  V_TakeProfitPips){ CloseAllOrders(MagicNumber); Print ("V_TakeProfitPips закрываем по ТР = ", V_TakeProfitPips); }  
        }        
      
      
      // Если тралить, то с соответствующего номера итерации при выполнении НЕОБХОДИМОГО УСЛОВИЯ соответствующим 
      // выбранному видом трала      
      
      if (UseTrailing==1) if ((Iteration >= k)&& (MathAbs(orderProfit) > (MathAbs (Sum_Loss))))
         switch(type)
          {
           case 0:  // простой трал по аналогии учебнику - в зависимости от параметра trlinloss (тралить ли в зоне лоссов)
                   if (orderType == OP_BUY)  SampleTrailing_texbook (0, V_StopLossPips, V_TakeProfitPips); // если бай
                   if (orderType == OP_SELL) SampleTrailing_texbook (1, V_StopLossPips, V_TakeProfitPips); // если селл
                   break;
           //трал по фракталам + отступ (Indent)
           case 1: TrailingByFractals_LAVINA(ticket,signal_period,Sum_Loss,Lots_New,V_StopLossPips,trlinloss); break; 
            //трал по теням N свечей + отступ (Indent)       
           case 2: TrailingByShadows  (ticket,signal_period,Sum_Loss,Lots_New,V_StopLossPips,trlinloss);  break;   
          }           
       

P.S. Tu vas m'enlever tout mon robot de combat des mains, que je suis en train de manger en ce moment. J'y travaille avec des interruptions et des sorties vers des algorithmes appropriés depuis septembre 2010. Voir le fil de discussion - Avalanche.

 

Maintien du code dans la remorque car elle est plus grande que la taille autorisée :

 
     
Dossiers :
itdakxijrxj.mq4  11 kb
 
Roman.:

Oui. C'est mon code. Je vous ai déjà écrit que je l'utilise dans ma martin de retournement comme suit :

Si la dernière transaction (pose) a été clôturée en profit, alors nous mettons à zéro le nombre de flips (itération) et nous commençons avec le lot de départ, si celui-ci est déficitaire,

on calcule le nombre de trades perdants d'affilée et on ouvre dans le sens inverse en augmentant le volume.

Il s'agit d'une version compensée d'Avalanche (voir la branche du même nom ), c'est-à-dire que l'ordre de marché est fermé (à la position flip sur des volumes plus importants) et l'ordre de marché opposé est ouvert sur des volumes plus importants en fonction du schéma d'action. Voici ma partie du code qui fonctionne. Modifiez-le en fonction de vos besoins si vous disposez d'un algorithme d'exp similaire. Je ne comprends rien à votre question. Vous pouvez demander indépendamment de la situation dans la branche "Toute question de débutant ...", mais décrire votre question plus en détail, parce que rien (au moins pour moi) est clair - du tout.

P.S. C'est comme ça que tu vas attirer tous mes robots de combat, dont je me nourris. J'y travaille avec des interruptions et des sorties vers des algorithmes appropriés depuis septembre 2010. Voir le fil de discussion - Avalanche.


J'ai déjà posé la question dans le fil de discussion "toute question pour les débutants" et c'est le silence.

La situation est que lorsque ce code ferme la transaction en perte, il se souvient du solde négatif, et lorsqu'il ferme la transaction en plus, et que le plus est inférieur au solde, il remet à zéro Sum_Loss, et j'ai besoin qu'il ne soit pas remis à zéro, et fauché.

Voici donc comment cela fonctionne maintenant :

il vérifie un ordre fermé, si le profit de l'ordre fermé est inférieur à zéro, alors ce profit est ajouté à Sum_Loss, et ainsi de suite jusqu'à ce que le profit de la transaction ouverte dépasse (sera supérieur à) Sum_Loss, lorsqu'il est atteint, la transaction est fermée, et Sum_Loss est remis à zéro et le cycle recommence.

J'en ai besoin :

Si l'ordre suivant s'est clôturé avec un profit positif, Sum_Loss est réduit du montant dérivé du profit, ce qui signifie que le prochain ordre ouvert Sum_Loss est déjà plus petit, et ainsi de suite jusqu'à ce que le profit de l'ordre soit supérieur à Sum_Loss, et alors Sum_Loss est effacé et un nouveau cycle commence.

Sum_Loss = 0 ;

1er ordre fermé : Profit (-50) < 0

Somme_Perte + bénéfice (Somme_Perte + (-50))

Sum_Loss = -50 ;

2ème ordre fermé : Profit (+40) > 0 et Sum_Loss < 0

Somme_perte + bénéfice (Somme_perte + 40)

Sum_Loss = -10

 
belck:

1. j'ai déjà abordé le fil de discussion "toutes les questions des débutants" et il y a un silence.

La situation est la suivante : lorsque ce code ferme une transaction en perte, il se souvient du solde négatif, mais lorsqu'il ferme une transaction en profit, et que le plus est inférieur au solde, il réinitialise Sum_Loss, mais j'ai besoin qu'il ne réinitialise pas, mais qu'il réduise.

2. Donc, pour l'instant, c'est comme ça que ça marche :

il vérifie un ordre fermé, si le profit de l'ordre fermé est inférieur à zéro, alors ce profit est ajouté à Sum_Loss, et ainsi de suite jusqu'à ce que le profit de la transaction ouverte ne dépasse pas (sera supérieur à) Sum_Loss, lorsqu'il est atteint, la transaction est fermée, et Sum_Loss est réinitialisé et le cycle recommence.

3. J'ai besoin :

Si l'ordre s'est clôturé avec un profit négatif, le profit négatif a été ajouté à Sum_Loss ; ensuite, si la transaction suivante s'est clôturée avec un profit positif, Sum_Loss est diminué du montant reçu du profit ; cela signifie que la prochaine transaction ouverte recevra un montant Sum_Loss plus petit, et ainsi de suite, jusqu'à ce que le profit de l'ordre soit supérieur à Sum_Loss, et alors Sum_Loss est effacé et un nouveau cycle commence.

Sum_Loss = 0 ;

1er ordre fermé : Profit (-50) < 0

Somme_Perte + bénéfice (Somme_Perte + (-50))

Sum_Loss = -50 ;

2ème ordre fermé : Profit (+40) > 0 et Sum_Loss < 0

Somme_perte + bénéfice (Somme_perte + 40)

Sum_Loss = -10

1. postulez à nouveau - il y a des gens qui vous aideront certainement. Ayant précédemment mis votre code dans cette branche... (tel qu'il est)

2. C'est exact, car c'est l'algorithme de base d'Avalanche.

3. Tout cela et décrivez-le dans le fil de discussion des débutants avec votre code pour cet algorithme. Les gens le corrigeront. Commencez à écrire du code sur mcl4 vous-même de manière cohérente et silencieuse.

Si vous ne pouvez pas le faire vous-même, allez dans la section "Emplois" du cinquième forum - ils y écrivent pour la nourriture...

J'écrirai du code à partir de zéro gratuitement UNIQUEMENT si vous avez un intérêt personnel !

Tout.

 

Vous pouvez expirer... :-)

Un tas de commandes cette fois-ci... :-) fermé en profit !

Chouettes DoublePlus et vse_dlya_sela_J_OsMA_kh + ma variante (également avec description du TS) avec réglages - en branche.

 
Roman.:

Vous pouvez expirer... :-)

Un tas de commandes cette fois-ci... :-) fermé en profit !

Chouettes DoublePlus et vse_dlya_sela_J_OsMA_kh + ma variante (également avec la description du TS) avec les paramètres - dans la branche.


Et vous savez personnellement comment programmer ?

Je ne suis pas un grand programmeur.

Peut-être pouvez-vous encore m'aider à compléter le code ?

 
Roman.:

Vous pouvez expirer... :-)

Un tas de commandes cette fois-ci... :-) fermé en profit !

Et regrette qu'aucun lot n'ait été ajouté avant le bénéfice ? :))
 
belck:

Je ne suis pas un grand programmeur.

Peut-être que tu peux m'aider à finir le code après tout ?

Si vous ne voulez pas le faire vous-même, contactez le service "Jobs" de mql5.com - ils réaliseront rapidement tous vos caprices.
 
Roman.:
C'est bon.
PS : Tous les traders sauf nous sont endormis.
Raison: