lernen, wie man Geld verdient Dorfbewohner [Episode 2] ! - Seite 102

 

Grüße.

vielleicht ist jemand mit diesem Code vertraut:

//-----------------Закрытие по истории в безубыток--------------------
   //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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;
           

Ich kann das nicht ändern: Wenn ein Geschäft im Minus abgeschlossen wird, wird die Schleife geöffnet, und wenn der nächste Auftrag über Null abgeschlossen wird, d.h. mit positivem Saldo, aber weniger als negativ, addieren wir Plus zu Minus und erhalten einen neuen negativen Wert, der bereits weniger ist.

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

Wenn das Signal negativer ist, schließen wir den Auftrag und beginnen den Zyklus von vorne.

 
belck:

Hallo.

Vielleicht ist jemand mit diesem Code vertraut:

Ja, das ist mein Code. Ich habe Ihnen bereits geschrieben, dass ich es in meinem Rollover-Martin wie folgt verwende:

Wenn der letzte Handel (Pose) mit Gewinn abgeschlossen wurde, dann wird die Anzahl der Flips (Iteration) auf Null gesetzt und mit dem Startlot begonnen, wenn es im Minus ist,

Zählen Sie dann die Anzahl der Verlustgeschäfte in einer Reihe und eröffnen Sie in die entgegengesetzte Richtung mit einem erhöhten Volumen.

Es handelt sich um eine Netting-Version von Avalanche (siehe den gleichnamigen Zweig), d.h. die Marktorder wird geschlossen (bei Positionsumkehr bei erhöhtem Volumen) und die entgegengesetzte Marktorder wird bei größerem Volumen je nach Aktienschema geöffnet. Hier ist mein funktionierender Teil des Codes. Wenn Sie einen ähnlichen Algorithmus haben, passen Sie ihn an Ihre Bedürfnisse an. Ich verstehe in Ihrer Frage nichts. Sie können unabhängig von der Situation in der "Jeder Neuling Frage ...", nur näher auf Ihre Frage, denn nichts (zumindest für mich) ist klar - überhaupt.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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. Du wirst mir meinen ganzen Kampfroboter aus den Händen nehmen, den ich gerade esse. Seit September 2010 arbeite ich daran, mit Unterbrechungen und Ausstiegen zu richtigen Algorithmen. Siehe Thema - Avalanche.

 

Beibehaltung des Codes im Anhänger, da er größer als die zulässige Größe ist:

 
     
Dateien:
itdakxijrxj.mq4  11 kb
 
Roman.:

Ja, das ist mein Code. Ich habe Ihnen bereits geschrieben, dass ich es in meinem Rollover-Martin wie folgt verwende:

Wenn der letzte Handel (Pose) mit Gewinn abgeschlossen wurde, wird die Anzahl der Flips (Iteration) auf Null gesetzt und mit dem Startlot begonnen, falls ein Defizit besteht,

berechnen wir die Anzahl der unrentablen Geschäfte in einer Reihe und eröffnen in die entgegengesetzte Richtung, indem wir das Volumen erhöhen.

Es handelt sich um eine Netting-Version von Avalanche (siehe den gleichnamigen Zweig), d.h. die Marktorder wird geschlossen (bei Positionsumkehr bei erhöhtem Volumen) und die entgegengesetzte Marktorder wird bei größerem Volumen je nach Aktienschema geöffnet. Hier ist mein funktionierender Teil des Codes. Wenn Sie einen ähnlichen Algorithmus haben, passen Sie ihn an Ihre Bedürfnisse an. Ich verstehe in Ihrer Frage nichts. Du kannst sie unabhängig von der Situation im Zweig "Jede Anfängerfrage ..." stellen, aber beschreibe deine Frage genauer, denn nichts ist (zumindest für mich) klar - überhaupt nicht.

P.S. So werden Sie alle meine Kampfroboter ausschalten, von denen ich mich ernähre. Seit September 2010 arbeite ich mit Unterbrechungen und Ausstiegen zu richtigen Algorithmen daran. Siehe Thema - Avalanche.


Ich habe bereits im Thread "Fragen für Neulinge" gefragt und es herrscht Schweigen.

Die Situation ist, dass, wenn dieser Code schließt das Geschäft in Verlust, es merkt sich die Minus-Balance, und wenn es schließt das Geschäft in der plus, und das Plus ist weniger als das Gleichgewicht, es nulled Sum_Loss, und ich brauche, dass es nicht nulled, und gemäht.

Und so funktioniert es jetzt:

er prüft eine geschlossene Order, wenn der Gewinn der geschlossenen Order kleiner als Null ist, dann wird dieser Gewinn zu Sum_Loss addiert, und so weiter, bis der Gewinn des offenen Handels Sum_Loss übersteigt (mehr als), wenn er erreicht ist, wird der Handel geschlossen, und Sum_Loss wird auf Null gesetzt und der Zyklus beginnt erneut.

Ich brauche:

Wenn ein Auftrag mit einem Minus abgeschlossen wurde, wurde der Minusgewinn zu Sum_Loss addiert. Wenn der nächste Auftrag mit einem positiven Gewinn abgeschlossen wurde, wird Sum_Loss um den Betrag des Gewinns reduziert, was bedeutet, dass der nächste offene Auftrag Sum_Loss bereits einen kleineren Betrag aufweist, und so weiter, bis der Auftragsgewinn höher ist als Sum_Loss, dann wird Sum_Loss gelöscht und ein neuer Zyklus beginnt.

Summe_Verlust = 0;

1. geschlossener Auftrag: Gewinn (-50) < 0

Summe_Verlust + Gewinn (Summe_Verlust + (-50))

Summe_Verlust = -50;

2. geschlossener Auftrag: Gewinn (+40) > 0 und Summe/Verlust < 0

Summe_Verlust + Gewinn (Summe_Verlust + 40)

Summe_Verlust = -10

 
belck:

1. ich habe mich bereits an den Thread "Fragen von Anfängern" gewandt und es herrscht Schweigen.

Wenn dieser Code ein Geschäft mit Verlust abschließt, merkt er sich den negativen Saldo, aber wenn er ein Geschäft mit Gewinn abschließt und das Plus kleiner als der Saldo ist, setzt er Sum_Loss zurück, aber ich brauche ihn nicht zum Zurücksetzen, sondern zum Absenken.

2. im Moment funktioniert es folgendermaßen:

er prüft einen geschlossenen Auftrag, wenn der Gewinn des geschlossenen Auftrags kleiner als Null ist, dann wird dieser Gewinn zu Sum_Loss addiert, und so weiter, bis der Gewinn des offenen Geschäfts Sum_Loss nicht übersteigt (mehr als), wenn er erreicht ist, wird das Geschäft geschlossen, und Sum_Loss wird zurückgesetzt und der Zyklus beginnt erneut.

3. ich brauche:

Wenn der Auftrag mit einem Minus abgeschlossen wurde, wurde der Minusgewinn zu Sum_Loss addiert; wenn das nächste Geschäft mit einem positiven Gewinn abgeschlossen wurde, wird Sum_Loss um den Betrag des Gewinns verringert; das bedeutet, dass das nächste offene Geschäft einen kleineren Betrag von Sum_Loss erhält, und so weiter, bis der Auftragsgewinn größer als Sum_Loss ist, dann wird Sum_Loss gelöscht und ein neuer Zyklus beginnt.

Summe_Verlust = 0;

1. geschlossener Auftrag: Gewinn (-50) < 0

Summe_Verlust + Gewinn (Summe_Verlust + (-50))

Summe_Verlust = -50;

2. geschlossener Auftrag: Gewinn (+40) > 0 und Summe/Verlust < 0

Summe_Verlust + Gewinn (Summe_Verlust + 40)

Summe_Verlust = -10

1. Bewerben Sie sich erneut - dort gibt es Menschen, die Ihnen bestimmt helfen werden. Nachdem Sie Ihren Code zuvor in diesen Zweig gestellt haben... (wie es ist)

2. Das ist richtig, denn das ist der Grundalgorithmus von Avalanche.

3. Beschreiben Sie all dies im Einsteiger-Thread mit Ihrem Code für diesen Algorithmus. Die Menschen werden sie korrigieren. Fangen Sie selbst an, konsequent und leise Code auf mcl4 zu schreiben.

Wenn Sie es nicht selbst tun können, gehen Sie in die Rubrik "Jobs" im fünften Forum - dort wird für Lebensmittel geschrieben...

Werde Code von Grund auf kostenlos schreiben, NUR wenn Sie persönliches Interesse haben!

Alles.

 

Sie können ausatmen... :-)

Ein Haufen Aufträge diesmal... :-) mit Gewinn abgeschlossen!

DoublePlus und vse_dlya_sela_J_OsMA_kh Eulen + meine Variante (auch mit Beschreibung von TS) mit Einstellungen - im Zweig.

 
Roman.:

Sie können ausatmen... :-)

Ein Haufen Aufträge diesmal... :-) mit Gewinn abgeschlossen!

DoublePlus und vse_dlya_sela_J_OsMA_kh Eulen + meine Variante (auch mit Beschreibung von TS) mit Einstellungen - in der Filiale.


Und Sie wissen selbst, wie man programmiert?

Ich bin kein guter Programmierer.

Vielleicht können Sie mir noch helfen, den Code zu vervollständigen?

 
Roman.:

Sie können ausatmen... :-)

Ein Haufen Aufträge diesmal... :-) mit Gewinn abgeschlossen!

Und bedauert, dass keine Lose vor dem Gewinn hinzugefügt wurden? :))
 
belck:

Ich bin kein guter Programmierer.

Vielleicht können Sie mir helfen, den Code doch noch fertigzustellen?

Wenn Sie es nicht selbst tun, wenden Sie sich an den "Jobs"-Service von mql5.com - dort werden alle Ihre Wünsche schnell erfüllt.
 
Roman.:
Das ist in Ordnung.
PS: Alle Händler, außer uns, schlafen noch.