imparare a guadagnare soldi abitanti del villaggio [Episodio 2]! - pagina 102

 

Saluti.

forse qualcuno ha familiarità con questo codice:

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

Non riesco a cambiare questo: quando un affare è stato chiuso in meno, il ciclo viene aperto e se il prossimo ordine viene chiuso sopra lo zero, cioè con un saldo positivo, ma inferiore al negativo, si aggiunge il più al negativo e si ottiene un nuovo valore negativo, che è già inferiore.

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

Se è più negativo, secondo il segnale, chiudiamo l'ordine e ricominciamo il ciclo dall'inizio.

 
belck:

Salve.

Forse qualcuno ha familiarità con questo codice:

Sì, questo è il mio codice. Vi ho già scritto che lo uso nel mio rollover martin come segue:

Se l'ultimo trade (pose) è stato chiuso in profitto, allora azzeriamo il numero di flip (Iterazione) e iniziamo con il lotto di partenza, se in meno,

poi contare il numero di trade consecutivi perdenti e aprire nella direzione opposta con un volume aumentato.

Questa è una versione netting di Avalanche (vedi il ramo con lo stesso nome ), cioè l'ordine di mercato viene chiuso (quando si inverte una posizione su volumi maggiori) e l'ordine di mercato opposto viene aperto su volumi maggiori a seconda dello schema delle azioni. Ecco la mia parte di codice funzionante. Modificatelo per adattarlo alle vostre esigenze se avete un algoritmo exp simile. Non capisco nulla nella sua domanda. Puoi chiedere indipendentemente dalla situazione nella sezione "Any newbie question ...", basta elaborare la tua domanda, perché nulla (almeno per me) è chiaro - a tutti.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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. Mi toglierai dalle mani tutto il mio robot da battaglia, che sto mangiando in questo momento. Ci sto lavorando con interruzioni e uscite per algoritmi adeguati da settembre 2010. Vedere il thread - Avalanche.

 

Continuazione del codice nel rimorchio in quanto è più grande della dimensione consentita:

 
     
File:
itdakxijrxj.mq4  11 kb
 
Roman.:

Sì, questo è il mio codice. Vi ho già scritto che lo uso nel mio rollover martin come segue:

Se l'ultimo trade (pose) è stato chiuso in profitto, allora azzeriamo il numero di lanci (Iterazione) e cominciamo con il lotto di partenza, se in deficit,

calcoliamo il numero di trade perdenti di fila e apriamo nella direzione opposta aumentando il volume.

Questa è una versione netting di Avalanche (vedi il ramo con lo stesso nome ), cioè l'ordine di mercato viene chiuso (quando si inverte una posizione su volumi maggiori) e l'ordine di mercato opposto viene aperto su volumi maggiori a seconda dello schema delle azioni. Ecco la mia parte di codice funzionante. Modificatelo per adattarlo alle vostre esigenze se avete un algoritmo exp simile. Non capisco nulla nella sua domanda. Puoi chiederlo indipendentemente dalla situazione nel ramo "Any newbie question ...", ma descrivi la tua domanda più chiaramente, perché niente (almeno per me) è chiaro - per niente.

P.S. Questo è il modo in cui attirerai fuori tutto il mio robot da battaglia, di cui mi sto nutrendo. Ci sto lavorando con interruzioni e uscite per algoritmi adeguati da settembre 2010. Vedi thread - Avalanche.


Ho già chiesto nel thread "any newbie question" e c'è silenzio.

La situazione è che quando questo codice chiude l'affare in perdita, ricorda il saldo meno, e quando chiude l'affare nel più, e il più è meno del saldo, azzera Sum_Loss, e ho bisogno che non si azzeri, e falciato.

Quindi è così che funziona ora:

controlla un ordine chiuso, se il profitto dell'ordine chiuso è inferiore a zero, allora questo profitto viene aggiunto a Sum_Loss, e così via fino a quando il profitto del trade aperto supera (sarà più di) Sum_Loss, quando raggiunto, il trade viene chiuso, e Sum_Loss viene azzerato e il ciclo inizia di nuovo.

Ho bisogno di:

ordine chiuso in meno, il suo profitto in meno è stato aggiunto a Sum_Loss, poi se l'affare successivo ha chiuso con un profitto positivo, Sum_Loss viene ridotto dell'importo derivato dal profitto, il che significa che il prossimo ordine aperto Sum_Loss è già un importo minore, e così via fino a quando il profitto dell'ordine è maggiore di Sum_Loss, e poi Sum_Loss viene cancellato e inizia un nuovo ciclo.

Somma_perdita = 0;

1° ordine chiuso: Profitto (-50) < 0

Somma_perdita + profitto (Somma_perdita + (-50))

Somma_perdita = -50;

2° ordine chiuso: Profit (+40) > 0 e Sum_Loss < 0

Somma_perdita + profitto (Somma_perdita + 40)

Somma_Perdita = -10

 
belck:

1. Ho già affrontato il thread "qualsiasi domanda del principiante" e c'è silenzio.

La situazione è che quando questo codice chiude una transazione in perdita, ricorda il saldo negativo, ma quando chiude una transazione in profitto, e il plus è inferiore al saldo, resetta Sum_Loss, ma ho bisogno che non resetti, ma che falci.

2. Quindi, in questo momento funziona così:

controlla un ordine chiuso, se il profitto dell'ordine chiuso è inferiore a zero, allora questo profitto viene aggiunto a Sum_Loss, e così via fino a quando il profitto dell'affare aperto non supera (sarà più di) Sum_Loss, quando raggiunto, l'affare viene chiuso, e Sum_Loss viene resettato e il ciclo ricomincia.

3. Ho bisogno:

L'ordine ha chiuso con un meno, il suo profitto meno è stato aggiunto a Sum_Loss; poi se l'affare successivo ha chiuso con un profitto positivo, Sum_Loss è diminuito dell'importo ricevuto dal profitto; significa che il prossimo affare aperto riceverà un importo minore di Sum_Loss, e così via, fino a quando il profitto dell'ordine è maggiore di Sum_Loss, e poi Sum_Loss viene cancellato e inizia un nuovo ciclo.

Somma_perdita = 0;

1° ordine chiuso: Profitto (-50) < 0

Somma_perdita + profitto (Somma_perdita + (-50))

Somma_perdita = -50;

2° ordine chiuso: Profit (+40) > 0 e Sum_Loss < 0

Somma_perdita + profitto (Somma_perdita + 40)

Somma_Perdita = -10

1. fai di nuovo domanda - ci sono persone che sicuramente ti aiuteranno. Avendo precedentemente messo il tuo codice in quel ramo... (come è)

2. Esatto, perché questo è l'algoritmo di base di Avalanche.

3. Tutto questo e descrivilo nel thread del principiante con il tuo codice per questo algoritmo. La gente lo correggerà. Iniziate a scrivere codice su mcl4 da soli in modo coerente e tranquillo.

Se non puoi farlo da solo, vai nella sezione "Jobs" del quinto forum - lì scrivono per il cibo...

Scriverà codice da zero gratuitamente SOLO se hai un interesse personale!

Tutto.

 

Puoi espirare... :-)

Un sacco di ordini questa volta... :-) chiuso in profitto!

DoublePlus e vse_dlya_sela_J_OsMA_kh gufi + la mia variante (anche con la descrizione di TS) con impostazioni - in ramo.

 
Roman.:

Puoi espirare... :-)

Un sacco di ordini questa volta... :-) chiuso in profitto!

DoublePlus e vse_dlya_sela_J_OsMA_kh gufi + la mia variante (anche con descrizione di TS) con le impostazioni - nel ramo.


E tu personalmente sai programmare?

Non sono un gran programmatore.

Forse puoi ancora aiutarmi a completare il codice?

 
Roman.:

Puoi espirare... :-)

Un sacco di ordini questa volta... :-) chiuso in profitto!

E si rammarica che non siano stati aggiunti lotti prima del profitto? :))
 
belck:

Non sono un gran programmatore.

Forse puoi aiutarmi a finire il codice dopo tutto?

Se non lo fai da solo, contatta il servizio "Jobs" di mql5.com - completeranno rapidamente ogni tuo capriccio.
 
Roman.:
Va bene.
PS: Tutti i commercianti tranne noi dormono.