Aprenda a ganhar dinheiro com os aldeões [Episódio 2] ! - página 102

 
BeerGod:

Terceiro dia de negociação manual, a negociação acabou por hoje


Parabéns! Eu tenho um monte de vendas sobre o euro em um pullback down - fechado, sobre a libra - não...

50.000 centavos - já passou - já é bom! :-)

 

Saudações.

talvez alguém esteja familiarizado com este código:

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

não posso mudar isto: quando um negócio foi fechado em menos, o loop é aberto e se a próxima ordem é fechada acima de zero, ou seja, saldo positivo, mas menos que negativo, adicionamos mais ao negativo e obtemos um novo valor negativo, que já é menor.

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

Se for mais negativo, de acordo com o sinal, fechamos a ordem e iniciamos o ciclo desde o início.

 
belck:

Olá.

Talvez alguém esteja familiarizado com este código:

Sim. Este é o meu código. Já escrevi que o utilizo em meu martin rollover da seguinte forma:

Se a última negociação (pose) foi fechada com lucro, então nós zeramos o número de inversões (Iteração) e começamos com o lote inicial, se em menos,

depois contar o número de negócios perdidos consecutivamente e abrir na direção oposta com um volume maior.

Esta é uma versão netting da Avalanche (ver a filial com o mesmo nome ), ou seja, a ordem de mercado é fechada (quando se inverte uma posição sobre volumes maiores) e a ordem de mercado oposta é aberta sobre volumes maiores, dependendo do esquema de ações. Esta é a minha parte de trabalho do código. Edite-o de acordo com suas necessidades se você tiver um algoritmo de exp. similar. Eu não entendo nada em sua pergunta. Você pode perguntar independentemente da situação na "Qualquer pergunta de novato ...", apenas desenvolva sua pergunta, porque nada (pelo menos para mim) é claro - de forma alguma.

  //---------------------расчет по истории ордеров номера очередной итерации----------------------------------------------- 
  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. Você vai tirar todo o meu robô de batalha das minhas mãos, que eu estou comendo agora mesmo. Tenho trabalhado nisso com interrupções e saídas para algoritmos apropriados desde setembro de 2010. Ver linha - Avalanche.

 

Continuação do código no trailer por ser maior do que o tamanho permitido:

 
     
Arquivos anexados:
itdakxijrxj.mq4  11 kb
 
Roman.:

Sim. Este é o meu código. Já escrevi que o utilizo em meu martin rollover da seguinte forma:

Se a última negociação (pose) foi fechada com lucro, então nós zeramos o número de inversões (Iteração) e começamos com o lote inicial, se estiver em déficit,

calculamos o número de negócios perdidos em uma linha e abrimos na direção oposta aumentando o volume.

Esta é uma versão netting da Avalanche (ver a filial com o mesmo nome ), ou seja, a ordem de mercado é fechada (na posição de virada sobre volumes maiores) e a ordem de mercado oposta é aberta sobre volumes maiores, dependendo do esquema de ações. Esta é a minha parte de trabalho do código. Edite-o de acordo com suas necessidades se você tiver um algoritmo de exp. similar. Eu não entendo nada em sua pergunta. Você pode perguntar independentemente da situação no ramo "Qualquer pergunta de novato ...", mas descreva sua pergunta com mais detalhes, porque nada (pelo menos para mim) é claro - de todo.

P.S. É assim que você vai atrair todo o meu robô de batalha, que eu estou comendo da minha mão. Tenho trabalhado nisso com interrupções e saídas para algoritmos apropriados desde setembro de 2010. Ver linha - Avalanche.


Eu já perguntei no tópico "qualquer pergunta de novato" e há silêncio.

A situação é que quando este código fecha o negócio em prejuízo, ele se lembra do saldo negativo, e quando fecha o negócio em mais, e o mais é menor que o saldo, ele zerou Sum_Loss, e eu preciso que ele não zerou, e cortou para baixo.

Portanto, é assim que funciona agora:

ele verifica uma ordem fechada, se o lucro da ordem fechada for menor que zero, então este lucro é adicionado à Soma_Perda, e assim por diante até que o lucro do comércio aberto exceda (será mais que) Soma_Perda, quando alcançado, o comércio é fechado, e a Soma_Perda é zerada e o ciclo começa novamente.

Eu preciso:

ordem fechada em menos, seu lucro negativo foi adicionado ao Sum_Loss, então se o próximo negócio fechado com lucro positivo, o Sum_Loss é reduzido pelo montante recebido do lucro, o que significa que o próximo pedido aberto Sum_Loss já é um montante menor, e assim por diante até que o lucro do pedido seja maior que o Sum_Loss, e então o Sum_Loss é limpo e um novo ciclo começa.

Soma_Perda = 0;

1ª ordem fechada: Lucro (-50) < 0

Soma_Perda + lucro (Soma_Perda + (-50))

Soma_Perda = -50;

2ª ordem fechada: Lucro (+40) > 0 e Soma_Perda < 0

Soma_Perda + lucro (Soma_Perda + 40)

Soma_Perda = -10

 
belck:

1. já abordei o tópico "qualquer pergunta de principiante" e há silêncio.

A situação é que quando este código fecha um negócio com prejuízo, ele se lembra do saldo negativo, mas quando fecha um negócio com lucro, e o mais é menor que o saldo, ele redefine o Sum_Loss, mas eu preciso dele não para redefinir, mas para cortar a relva.

2. portanto, agora é assim que funciona:

ele verifica uma ordem fechada, se o lucro da ordem fechada for menor que zero, então este lucro é adicionado à Soma_Perda, e assim por diante até que o lucro da ordem aberta não exceda (será maior que) Soma_Perda, quando alcançada, a ordem é fechada, e Soma_Perda é reiniciada e o ciclo começa novamente.

3. eu preciso:

A ordem fechada com menos, seu lucro negativo foi adicionado à Soma_Perda; então, se a próxima transação fechada com lucro positivo, a Soma_Perda é diminuída pela quantia recebida do lucro; isso significa que a próxima transação aberta receberá uma quantia menor de Soma_Perda, e assim por diante, até que o lucro da ordem seja maior que a Soma_Perda, e então a Soma_Perda é compensada e um novo ciclo começa.

Soma_Perda = 0;

1ª ordem fechada: Lucro (-50) < 0

Soma_Perda + lucro (Soma_Perda + (-50))

Soma_Perda = -50;

2ª ordem fechada: Lucro (+40) > 0 e Soma_Perda < 0

Soma_Perda + lucro (Soma_Perda + 40)

Soma_Perda = -10

1. Aplicar novamente - há pessoas lá que certamente ajudarão. Tendo previamente colocado seu código naquele ramo... (como está)

2. Isso mesmo, porque este é o algoritmo básico da Avalanche.

3. Tudo isso e descreva-o na linha do iniciante com seu código para este algoritmo. As pessoas irão corrigi-lo. Comece você mesmo a escrever código no mcl4 de forma consistente e silenciosa.

Se você não pode fazer isso sozinho, vá para a seção "Empregos" do quinto fórum - eles escrevem lá por comida...

Escreverá código do zero SOMENTE gratuitamente se você tiver interesse pessoal!

Tudo.

 

Você pode exalar... :-)

Um monte de ordens desta vez... :-) fechado em lucro!

DoublePlus e vse_dlya_sela_J_OsMA_kh owls + minha variante (também com descrição do TS) com configurações - em ramo.

 
Roman.:

Você pode exalar... :-)

Um monte de ordens desta vez... :-) fechado em lucro!

DoublePlus e vse_dlya_sela_J_OsMA_kh owls + minha variante (também com descrição do TS) com configurações - no ramo.


E você pessoalmente sabe como programar?

Não sou muito de programador.

Talvez você ainda possa me ajudar a completar o código?

 
Roman.:

Você pode exalar... :-)

Um monte de ordens desta vez... :-) fechado em lucro!

E lamenta que não tenham sido adicionados muitos antes do lucro? :))
 
belck:

Não sou muito de programador.

Talvez você possa me ajudar a terminar o código, afinal de contas?

Se você não puder fazê-lo você mesmo, entre em contato com o serviço "Jobs" em mql5.com - eles farão todos os seus caprichos rapidamente.
Razão: