Проблема - удваивает лот через сделку
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15

Тема: Проблема - удваивает лот через сделку

  1. #1
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5

    Проблема - удваивает лот через сделку

    Здравствуйте, уважаемые форумчане. Делаю советника, который будет удваивать лот после каждой убыточной сделки, но столкнулся с такой проблемой - почему-то лот удваивается с запозданием через одну сделку.

    пример:
    сделка 1. лот - 0,1 профит - +10
    сделка 2. лот - 0,1 профит - -10 (отрицательная сделка, после нее следующий лот должен быть удвоенным)
    сделка 3. лот - 0,1 профит - +10 (в этой сделке лот должен был удвоиться)
    сделка 4. лот - 0,2 профит - +10 (но удвоился он почему-то здесь)


    Помогите пожалуйста разобраться. За ранее огромное спасибо!


    Код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    
    
    double Lot; 
    double OrPrice;         
    double OrLots;         
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    
    
    
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---
       
    //---
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
      
      
    
    
    
     
      for(int i=0;i<OrdersTotal();i++)
       {
       if (OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY)) // Выбираем последний ордер из истории.
         {
          OrPrice=OrderProfit(); //узнаем профит закрытого ордера
          OrLots=OrderLots();  //узнаем объем(лот)закрытого ордера
         }
       }
    if(OrPrice<0)           //если профит меньше нуля (отрицательный показатель) то..
     {
    
    
     Lot=OrLots*2;       // ...умножаем лот на 2
             
    
                     if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                       {
                       OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Ask-10*Point, Ask+10*Point); // открываем ордер на БАЙ с удвоенным лотом
                       }
                     else
    
                     
                     
                     
                    if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                      {
                      OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Bid+10*Point, Bid-10*Point); // открываем ордер на СЕЛЛ с удвоенным лотом
                      }
                    else
                    Print("ORDER NE USTANOVLEN!!!");
     
     }
     else // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..
    
    
    
    
                     //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
                     if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                       {
                       OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-10*Point, Ask+10*Point); // открываем ордер на БАЙ
                       }
                     else
                     Print("BUY - ORDER NE USTANOVLEN!!!");
                                          
    
    
    
    
                    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
                    if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                      {
                      OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+10*Point, Bid-10*Point); // открываем ордер на СЕЛЛ
                      }
                    else
                    Print("ORDER NE USTANOVLEN!!!");
    
    
    
    
    
    
    
    
    
    
    
    
      
      
       return(0);
    }

    Вы не можете благодарить!

  2. #2
    Теоретик Аватар для TANZA
    Регистрация
    03.04.2013
    Адрес
    Днепропетровск
    Сообщений
    298
    Promo (¢)
    760
    Благодарности
    Получено: 70
    Отправлено: 45
    Цитата Сообщение от unikum22 Посмотреть сообщение
    Здравствуйте, уважаемые форумчане. Делаю советника, который будет удваивать лот после каждой убыточной сделки, но столкнулся с такой проблемой - почему-то лот удваивается с запозданием через одну сделку.

    пример:
    сделка 1. лот - 0,1 профит - +10
    сделка 2. лот - 0,1 профит - -10 (отрицательная сделка, после нее следующий лот должен быть удвоенным)
    сделка 3. лот - 0,1 профит - +10 (в этой сделке лот должен был удвоиться)
    сделка 4. лот - 0,2 профит - +10 (но удвоился он почему-то здесь)


    Помогите пожалуйста разобраться. За ранее огромное спасибо!

    Скрытый текст


    Код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    
    
    double Lot; 
    double OrPrice;         
    double OrLots;         
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
      {
    
    
    
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
      {
    //---
       
    //---
       return(0);
      }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
      
      
    
    
    
     
      for(int i=0;i<OrdersTotal();i++)
       {
       if (OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY)) // Выбираем последний ордер из истории.
         {
          OrPrice=OrderProfit(); //узнаем профит закрытого ордера
          OrLots=OrderLots();  //узнаем объем(лот)закрытого ордера
         }
       }
    if(OrPrice<0)           //если профит меньше нуля (отрицательный показатель) то..
     {
    
    
     Lot=OrLots*2;       // ...умножаем лот на 2
             
    
                     if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                       {
                       OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Ask-10*Point, Ask+10*Point); // открываем ордер на БАЙ с удвоенным лотом
                       }
                     else
    
                     
                     
                     
                    if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                      {
                      OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Bid+10*Point, Bid-10*Point); // открываем ордер на СЕЛЛ с удвоенным лотом
                      }
                    else
                    Print("ORDER NE USTANOVLEN!!!");
     
     }
     else // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..
    
    
    
    
                     //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
                     if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                       {
                       OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-10*Point, Ask+10*Point); // открываем ордер на БАЙ
                       }
                     else
                     Print("BUY - ORDER NE USTANOVLEN!!!");
                                          
    
    
    
    
                    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
                    if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                      {
                      OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+10*Point, Bid-10*Point); // открываем ордер на СЕЛЛ
                      }
                    else
                    Print("ORDER NE USTANOVLEN!!!");
    
    
    
    
    
    
    
    
    
    
    
    
      
      
       return(0);
    }
    [свернуть]
    Здравствуйте. Исправила ваш советник. Старайтесь писать код компактнее, а то вы сами себе создаете трудности. Вот например как у меня.

    Советник

    PHP код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    #define MAGIC  49274975

    extern double Lot             0.1;   // Лот
    extern int    StopLoss        10;    // Стоп Лосс
    extern int    TakeProfit      10;    // Тейк Профит
    extern double Multiplier      2;     // Множитель лота
    extern int    Slippage        3;     // Проскальзывание

    int ticket
    double SLTP;
    bool UpBar falseDownBar false;
    datetime PrevTime;
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       if (
    Digits == || Digits == 5)
       {
          
    StopLoss   *= 10;
          
    TakeProfit *= 10;
          
    Slippage   *= 10;
       }
       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {

       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
        if (
    PrevTime == Time[0]) return(0);
        
    PrevTime Time[0];
      
        if (
    Open[1] < Close[1] && Close[1] == High[1]) UpBar   true;
           else 
    UpBar false;
        if (
    Open[1] > Close[1] && Close[1] == Low[1])  DownBar true;
           else 
    DownBar false;
       
       if (
    LossOrder(GetLastOrderHist()) < 0)  //если профит меньше нуля (отрицательный показатель) то..
       
    {
          
    double maxlot  MarketInfo(Symbol(), MODE_MAXLOT);  //...расчитываем максимально допустимый лот,
          
    double lastlot NormalizeDouble(LotLossOrder(GetLastOrderHist()) * Multiplier2);  // нормализируем умноженный лот на множитель
          
    if (lastlot maxlotlastlot maxlot;  // если лот превышает максимальный то он равняется ему
          
    if (CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_BUYlastlotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
          else if(
    CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_SELLlastlotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }
       else 
    // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..
       
       //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
       
    if(CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
       
    {
          
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_BUYLotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ
       
    }
                                          
       
    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
       
    if(CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
       
    {
          
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_SELLLotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
       
    }


       return(
    0);
    }

    //+------------------------------------------------------------------+
    //| Количество открытых сделок                                       |
    //+------------------------------------------------------------------+
    int CountTrades()
    {
      
    int count 0;
      for (
    int i OrdersTotal()-1i>=0i--)
      {
        if(
    OrderSelect(i,SELECT_BY_POSMODE_TRADES))
        {
          if(
    OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
            
    count++;
        }
      }
      return(
    count);
    }

    //+------------------------------------------------------------------+
    //| Возвращает тикет последнего ордера истории                       |
    //+------------------------------------------------------------------+
    int GetLastOrderHist(int type = -1
    {
      
    int iticket = -1;
      
    datetime dt 0;
      
    int cnt OrdersHistoryTotal();
        
      for (
    int i=0cnti++) {
        if (!
    OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;

        
    //Опционально
        
    if (OrderSymbol() != Symbol()) continue;
        if (
    OrderMagicNumber() != MAGIC) continue;
        
        if (
    type != -&& OrderType() != type) continue;
        
        if (
    OrderCloseTime() > dt) {
          
    dt OrderCloseTime();
          
    iticket OrderTicket();
        }
      }
      
      return (
    iticket);
    }

    //+------------------------------------------------------------------+
    //| Возвращает убыток ордера истории за тикетом                      |
    //+------------------------------------------------------------------+
    double LossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double profit 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=0;cnt<total;cnt++)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    profit OrderProfit(); 
             break;
    //выход из цикла по ордерам
          
    }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    profit OrderProfit();
             break;
    //выход из цикла  по ордерам
          
    }
       }
    //конец цикла по ордерам
       
    return(profit);
    }

    //+------------------------------------------------------------------+
    //| Возвращает лот ордера истории за тикетом                         |
    //+------------------------------------------------------------------+
    double LotLossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double lot 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=0;cnt<total;cnt++)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    lot OrderLots(); 
             break;
    //выход из цикла по ордерам
          
    }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    lot OrderLots();
             break;
    //выход из цикла  по ордерам
          
    }
       }
    //конец цикла по ордерам
       
    return(lot);

    [свернуть]

    Вы не можете благодарить!

  3. #3
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5
    Уважаемый "TANZA" благодарю вас от всей души!!! вы мне очень помогли, спасибо вам большое!

    только я задумывал открытие ордера на каждой свечке, в сторону ее движения при условии, что у нее нет фетиля (ну с этим я уже сам разберусь). В тестере на периоде с января по июль этого года на дневном графике такой простой алгоритм дает неплохие результаты даже без использования мартина, TP и SL ставил по 50 на 4х знаке. При этом подряд идущих отрицательных сделок там было где-то 8-9 шт.

    Изучая потихоньку форекс понял одно, что нужно научиться торговать так, что бы было в результате длительной торговли максимум 5 отрицательных сделок подряд, а если это дело грамотно приправить мартином, то думаю что с этого может что-то получиться. Если что-то путнее получится, то обязательно с вами поделюсь.

    Вы не можете благодарить!
    Последний раз редактировалось unikum22; 20.07.2015 в 18:45.

  4. #4
    Теоретик Аватар для TANZA
    Регистрация
    03.04.2013
    Адрес
    Днепропетровск
    Сообщений
    298
    Promo (¢)
    760
    Благодарности
    Получено: 70
    Отправлено: 45
    Цитата Сообщение от unikum22 Посмотреть сообщение
    Уважаемый "TANZA" благодарю вас от всей души!!! вы мне очень помогли, спасибо вам большое!

    только я задумывал открытие ордера на каждой свечке, в сторону ее движения при условии, что у нее нет фетиля (ну с этим я уже сам разберусь). В тестере на периоде с января по июль этого года на дневном графике такой простой алгоритм дает неплохие результаты даже без использования мартина, TP и SL ставил по 50 на 4х знаке. При этом подряд идущих отрицательных сделок там было где-то 8-9 шт.

    Изучая потихоньку форекс понял одно, что нужно научиться торговать так, что бы было в результате длительной торговли максимум 5 отрицательных сделок подряд, а если это дело грамотно приправить мартином, то думаю что с этого может что-то получиться. Если что-то путнее получится, то обязательно с вами поделюсь.
    Если что-то будет еще не понятно, спрашивайте, постараюсь помочь. И, кстати, я в коде допустила маленькую ошибочку. Снизу правильный. Как думаете, в чем отличие?

    Правильный код советника

    PHP код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    #define MAGIC  49274975

    extern double Lot             0.1;   // Лот
    extern int    StopLoss        10;    // Стоп Лосс
    extern int    TakeProfit      10;    // Тейк Профит
    extern double Multiplier      2;     // Множитель лота
    extern int    Slippage        3;     // Проскальзывание

    int ticket
    double SLTP;
    bool UpBar falseDownBar false;
    datetime PrevTime;
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       if (
    Digits == || Digits == 5)
       {
          
    StopLoss   *= 10;
          
    TakeProfit *= 10;
          
    Slippage   *= 10;
       }
       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {

       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
        if (
    PrevTime == Time[0]) return(0);
        
    PrevTime Time[0];
      
        if (
    Open[1] < Close[1] && Close[1] == High[1]) UpBar   true;
           else 
    UpBar false;
        if (
    Open[1] > Close[1] && Close[1] == Low[1])  DownBar true;
           else 
    DownBar false;
       
       if (
    LossOrder(GetLastOrderHist()) < 0)  //если профит меньше нуля (отрицательный показатель) то..
       
    {
          
    double maxlot  MarketInfo(Symbol(), MODE_MAXLOT);  //...расчитываем максимально допустимый лот,
          
    double lastlot NormalizeDouble(LotLossOrder(GetLastOrderHist()) * Multiplier2);  // нормализируем умноженный лот на множитель
          
    if (lastlot maxlotlastlot maxlot;  // если лот превышает максимальный то он равняется ему
          
    if (CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_BUYlastlotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
          else if(
    CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_SELLlastlotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }
       else 
    // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..
       
    {
       
    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
       
    if(CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
       
    {
          
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_BUYLotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ
       
    }
                                          
       
    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
       
    if(CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
       
    {
          
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_SELLLotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
       
    }
       }


       return(
    0);
    }

    //+------------------------------------------------------------------+
    //| Количество открытых сделок                                       |
    //+------------------------------------------------------------------+
    int CountTrades()
    {
      
    int count 0;
      for (
    int i OrdersTotal()-1i>=0i--)
      {
        if(
    OrderSelect(i,SELECT_BY_POSMODE_TRADES))
        {
          if(
    OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
            
    count++;
        }
      }
      return(
    count);
    }

    //+------------------------------------------------------------------+
    //| Возвращает тикет последнего ордера истории                       |
    //+------------------------------------------------------------------+
    int GetLastOrderHist(int type = -1
    {
      
    int iticket = -1;
      
    datetime dt 0;
      
    int cnt OrdersHistoryTotal();
        
      for (
    int i=0cnti++) {
        if (!
    OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;

        
    //Опционально
        
    if (OrderSymbol() != Symbol()) continue;
        if (
    OrderMagicNumber() != MAGIC) continue;
        
        if (
    type != -&& OrderType() != type) continue;
        
        if (
    OrderCloseTime() > dt) {
          
    dt OrderCloseTime();
          
    iticket OrderTicket();
        }
      }
      
      return (
    iticket);
    }

    //+------------------------------------------------------------------+
    //| Возвращает профит ордера истории за тикетом                      |
    //+------------------------------------------------------------------+
    double LossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double profit 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    profit OrderProfit(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    profit OrderProfit();
          }
       }
    //конец цикла по ордерам
       
    return(profit);
    }

    //+------------------------------------------------------------------+
    //| Возвращает лот ордера истории за тикетом                         |
    //+------------------------------------------------------------------+
    double LotLossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double lot 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    lot OrderLots(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    lot OrderLots();
          }
       }
    //конец цикла по ордерам
       
    return(lot);

    [свернуть]

    Вы не можете благодарить!

  5. #5
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5
    Спасибо вам большое уважаемАЯ TANZA! (не заметил сразу, что вы девушка - извиняюсь) я увидел несколько отличий от первого кода.

    все отлично работает!

    система удвоения убыточных ордеров теперь есть! осталось придумать алгоритм, который в результате тестирования на длительном периоде времени:
    во первых - будет давать максимум 5 отрицательных сделок подряд
    во вторых - будет делать штук сто сделок в день

    как вы думаете, такое вообще возможно?

    Вы не можете благодарить!

  6. #6
    Теоретик Аватар для TANZA
    Регистрация
    03.04.2013
    Адрес
    Днепропетровск
    Сообщений
    298
    Promo (¢)
    760
    Благодарности
    Получено: 70
    Отправлено: 45
    Цитата Сообщение от unikum22 Посмотреть сообщение
    Спасибо вам большое уважаемАЯ TANZA! (не заметил сразу, что вы девушка - извиняюсь) я увидел несколько отличий от первого кода.

    все отлично работает!

    система удвоения убыточных ордеров теперь есть! осталось придумать алгоритм, который в результате тестирования на длительном периоде времени:
    во первых - будет давать максимум 5 отрицательных сделок подряд
    во вторых - будет делать штук сто сделок в день

    как вы думаете, такое вообще возможно?
    Насчет максимум 5 отрицательных сделок подряд я с вами согласна, а вот насчет ста сделок в день я думаю что это перебор. Нужно хотя бы 5-10 сделок в день, и чтобы из них профитных было больше. Вот тогда может что-то и получится.

    Вы не можете благодарить!

  7. #7
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5
    Почему я считаю, что нужно большое количество сделок в день, все просто, если использовать систему удвоения лота после отрицательной сделки, то таким образом могут появляться просадки способные уничтожить депозит. Следовательно приходится использовать безопасные настройки, которые даже в результате 20 отрицательных сделок подряд не дадут слить депозит. Что в свою очередь уменьшает процент дохода на каждую сделку в среднем и на весь депозит. Например если у вас будет 1000 сделок за месяц, то вы увеличите депозит допустим на 1%. Ну а если те же самые сделки пройдут за один день, то соответственно депозит увеличится на 1% за один день. Логично? или я в чем-то ошибаюсь?

    - - - Добавлено - - -

    Проверяю на тестере, ордера открываются, а вот на демо счете почему-то не работает советник, не открывает ордера, даже с лотом 0,01.

    Вы не можете благодарить!

  8. #8
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5
    Цитата Сообщение от TANZA Посмотреть сообщение
    Если что-то будет еще не понятно, спрашивайте, постараюсь помочь. И, кстати, я в коде допустила маленькую ошибочку. Снизу правильный. Как думаете, в чем отличие?

    Правильный код советника

    PHP код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    #define MAGIC  49274975

    extern double Lot             0.1;   // Лот
    extern int    StopLoss        10;    // Стоп Лосс
    extern int    TakeProfit      10;    // Тейк Профит
    extern double Multiplier      2;     // Множитель лота
    extern int    Slippage        3;     // Проскальзывание

    int ticket
    double SLTP;
    bool UpBar falseDownBar false;
    datetime PrevTime;
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       if (
    Digits == || Digits == 5)
       {
          
    StopLoss   *= 10;
          
    TakeProfit *= 10;
          
    Slippage   *= 10;
       }
       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {

       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
        if (
    PrevTime == Time[0]) return(0);
        
    PrevTime Time[0];
      
        if (
    Open[1] < Close[1] && Close[1] == High[1]) UpBar   true;
           else 
    UpBar false;
        if (
    Open[1] > Close[1] && Close[1] == Low[1])  DownBar true;
           else 
    DownBar false;
       
       if (
    LossOrder(GetLastOrderHist()) < 0)  //если профит меньше нуля (отрицательный показатель) то..
       
    {
          
    double maxlot  MarketInfo(Symbol(), MODE_MAXLOT);  //...расчитываем максимально допустимый лот,
          
    double lastlot NormalizeDouble(LotLossOrder(GetLastOrderHist()) * Multiplier2);  // нормализируем умноженный лот на множитель
          
    if (lastlot maxlotlastlot maxlot;  // если лот превышает максимальный то он равняется ему
          
    if (CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_BUYlastlotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
          else if(
    CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    ticket OrderSend(Symbol(), OP_SELLlastlotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }
       else 
    // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..
       
    {
       
    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
       
    if(CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
       
    {
          
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_BUYLotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ
       
    }
                                          
       
    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
       
    if(CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
       
    {
          
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
          
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
          
    ticket OrderSend(Symbol(), OP_SELLLotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
       
    }
       }


       return(
    0);
    }

    //+------------------------------------------------------------------+
    //| Количество открытых сделок                                       |
    //+------------------------------------------------------------------+
    int CountTrades()
    {
      
    int count 0;
      for (
    int i OrdersTotal()-1i>=0i--)
      {
        if(
    OrderSelect(i,SELECT_BY_POSMODE_TRADES))
        {
          if(
    OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
            
    count++;
        }
      }
      return(
    count);
    }

    //+------------------------------------------------------------------+
    //| Возвращает тикет последнего ордера истории                       |
    //+------------------------------------------------------------------+
    int GetLastOrderHist(int type = -1
    {
      
    int iticket = -1;
      
    datetime dt 0;
      
    int cnt OrdersHistoryTotal();
        
      for (
    int i=0cnti++) {
        if (!
    OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;

        
    //Опционально
        
    if (OrderSymbol() != Symbol()) continue;
        if (
    OrderMagicNumber() != MAGIC) continue;
        
        if (
    type != -&& OrderType() != type) continue;
        
        if (
    OrderCloseTime() > dt) {
          
    dt OrderCloseTime();
          
    iticket OrderTicket();
        }
      }
      
      return (
    iticket);
    }

    //+------------------------------------------------------------------+
    //| Возвращает профит ордера истории за тикетом                      |
    //+------------------------------------------------------------------+
    double LossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double profit 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    profit OrderProfit(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    profit OrderProfit();
          }
       }
    //конец цикла по ордерам
       
    return(profit);
    }

    //+------------------------------------------------------------------+
    //| Возвращает лот ордера истории за тикетом                         |
    //+------------------------------------------------------------------+
    double LotLossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double lot 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKETMODE_HISTORY))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    lot OrderLots(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    lot OrderLots();
          }
       }
    //конец цикла по ордерам
       
    return(lot);

    [свернуть]
    Проверяю на тестере, ордера открываются, решил проверить на демо счете, но почему-то не работает советник, не открывает ордера, даже с лотом 0,01.

    Вы не можете благодарить!

  9. #9
    Теоретик Аватар для TANZA
    Регистрация
    03.04.2013
    Адрес
    Днепропетровск
    Сообщений
    298
    Promo (¢)
    760
    Благодарности
    Получено: 70
    Отправлено: 45
    Цитата Сообщение от unikum22 Посмотреть сообщение
    почему я считаю, что нужно большое количество сделок в день, все просто, если использовать систему удвоения лота после отрицательной сделки, то таким образом могут появляться просадки способные уничтожить депозит. Следовательно приходится использовать безопасные настройки, которые даже в результате 20 отрицательных сделок подряд не дадут слить депозит. Что в свою очередь уменьшает процент дохода на каждую сделку в среднем и на весь депозит. Например если у вас будет 1000 сделок за месяц, то вы увеличите депозит допустим на 1%. Ну а если те же самые сделки пройдут за один день, то соответственно депозит увеличится на 1% за один день. Логично? или я в чем-то ошибаюсь?
    Ну не знаю, в чем-то может вы и правы. А вообще все зависит от стратегии. Если она прибыльная, то соответственно и советник будет таким же, несмотря на количество сделок.

    Цитата Сообщение от unikum22 Посмотреть сообщение
    проверяю на тестере, ордера открываются, а вот на демо счете почему-то не работает советник, не открывает ордера, даже с лотом 0,01
    Теперь по идее должно работать и на демо счете.

    Советник

    PHP код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    #define MAGIC  49284975

    extern double Lot             0.1;   // Лот
    extern int    StopLoss        10;    // Стоп Лосс
    extern int    TakeProfit      10;    // Тейк Профит
    extern double Multiplier      2;     // Множитель лота
    extern int    Slippage        3;     // Проскальзывание

    int ticket
    double SLTP;
    bool UpBar falseDownBar false;
    datetime PrevTime;
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       if (
    Digits == || Digits == 5)
       {
          
    StopLoss   *= 10;
          
    TakeProfit *= 10;
          
    Slippage   *= 10;
       }
       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {

       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
       if (
    PrevTime == Time[0]) return(0);
       
    PrevTime Time[0];
       
       if (
    Open[1] < Close[1] && Close[1] == High[1]) UpBar   true;
          else 
    UpBar false;
       if (
    Open[1] > Close[1] && Close[1] == Low[1])  DownBar true;
          else 
    DownBar false;
           
       if (
    LossOrder(GetLastOrderHist()) >= 0)// если последний ордер закрылся с положительным результатом или ордеров советника еще на истории нет то..
       
    {
          
    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
          
    if(CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_BUYLotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ
          
    }
                                          
          
    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
          
    if(CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_SELLLotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }

       if (
    LossOrder(GetLastOrderHist()) < 0)  //если профит меньше нуля (отрицательный показатель) то..
       
    {
          
    double maxlot  MarketInfo(Symbol(), MODE_MAXLOT);  //...расчитываем максимально допустимый лот,
          
    double lastlot NormalizeDouble(LotLossOrder(GetLastOrderHist()) * Multiplier2);  // нормализируем умноженный лот на множитель
          
    if (lastlot maxlotlastlot maxlot;  // если лот превышает максимальный то он равняется ему
          
    if (CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (lastlot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_BUYlastlotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
          else if(
    CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (lastlot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_SELLlastlotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }
       

       return(
    0);
    }

    //+------------------------------------------------------------------+
    //| Количество открытых сделок                                       |
    //+------------------------------------------------------------------+
    int CountTrades()
    {
      
    int count 0;
      for (
    int i OrdersTotal()-1i>=0i--)
      {
        if(
    OrderSelect(i,SELECT_BY_POSMODE_TRADES))
        {
          if(
    OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
            
    count++;
        }
      }
      return(
    count);
    }

    //+------------------------------------------------------------------+
    //| Возвращает тикет последнего ордера истории                       |
    //+------------------------------------------------------------------+
    int GetLastOrderHist(int type = -1
    {
      
    int iticket = -1;
      
    datetime dt 0;
      
    int cnt OrdersHistoryTotal();
        
      for (
    int i=0cnti++) {
        if (!
    OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;

        
    //Опционально
        
    if (OrderSymbol() != Symbol()) continue;
        if (
    OrderMagicNumber() != MAGIC) continue;
        
        if (
    type != -&& OrderType() != type) continue;
        
        if (
    OrderCloseTime() > dt) {
          
    dt OrderCloseTime();
          
    iticket OrderTicket();
        }
      }
      return (
    iticket);
    }

    //+------------------------------------------------------------------+
    //| Возвращает профит ордера истории за тикетом                      |
    //+------------------------------------------------------------------+
    double LossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double profit 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    if (iticket == -1) return(1);
       for(
    cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKET))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    profit OrderProfit(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    profit OrderProfit();
          }
       }
    //конец цикла по ордерам
       
    return(profit);
    }
    //+------------------------------------------------------------------+
    //| Возвращает лот ордера истории за тикетом                         |
    //+------------------------------------------------------------------+
    double LotLossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double lot 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKET))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    lot OrderLots(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    lot OrderLots();
          }
       }
    //конец цикла по ордерам
       
    return(lot);

    [свернуть]

    Вы не можете благодарить!

  10. #10
    Новичок
    Регистрация
    20.07.2015
    Сообщений
    17
    Promo (¢)
    655
    Благодарности
    Получено: 1
    Отправлено: 5
    Цитата Сообщение от TANZA Посмотреть сообщение
    Ну не знаю, в чем-то может вы и правы. А вообще все зависит от стратегии. Если она прибыльная, то соответственно и советник будет таким же, несмотря на количество сделок.


    Теперь по идее должно работать и на демо счете.

    Советник

    PHP код:
    //+------------------------------------------------------------------+
    //|                                                      Begemot.mq4 |
    //|                                                        Begemot32 |
    //|                                              http://www.mql5.com |
    //+------------------------------------------------------------------+
    #property copyright "Begemot32"
    #property link      "http://www.mql5.com"
    #property version   "1.00"
    #property strict
    #define MAGIC  49284975

    extern double Lot             0.1;   // Лот
    extern int    StopLoss        10;    // Стоп Лосс
    extern int    TakeProfit      10;    // Тейк Профит
    extern double Multiplier      2;     // Множитель лота
    extern int    Slippage        3;     // Проскальзывание

    int ticket
    double SLTP;
    bool UpBar falseDownBar false;
    datetime PrevTime;
    //+------------------------------------------------------------------+
    //| Expert initialization function                                   |
    //+------------------------------------------------------------------+
    int init()
    {
       if (
    Digits == || Digits == 5)
       {
          
    StopLoss   *= 10;
          
    TakeProfit *= 10;
          
    Slippage   *= 10;
       }
       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert deinitialization function                                 |
    //+------------------------------------------------------------------+
    int deinit()
    {

       return(
    0);
    }
    //+------------------------------------------------------------------+
    //| Expert start function                                             |
    //+------------------------------------------------------------------+
    int start()
    {
       if (
    PrevTime == Time[0]) return(0);
       
    PrevTime Time[0];
       
       if (
    Open[1] < Close[1] && Close[1] == High[1]) UpBar   true;
          else 
    UpBar false;
       if (
    Open[1] > Close[1] && Close[1] == Low[1])  DownBar true;
          else 
    DownBar false;
           
       if (
    LossOrder(GetLastOrderHist()) >= 0)// если последний ордер закрылся с положительным результатом или ордеров советника еще на истории нет то..
       
    {
          
    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
          
    if(CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_BUYLotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ
          
    }
                                          
          
    //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
          
    if(CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_SELLLotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }

       if (
    LossOrder(GetLastOrderHist()) < 0)  //если профит меньше нуля (отрицательный показатель) то..
       
    {
          
    double maxlot  MarketInfo(Symbol(), MODE_MAXLOT);  //...расчитываем максимально допустимый лот,
          
    double lastlot NormalizeDouble(LotLossOrder(GetLastOrderHist()) * Multiplier2);  // нормализируем умноженный лот на множитель
          
    if (lastlot maxlotlastlot maxlot;  // если лот превышает максимальный то он равняется ему
          
    if (CountTrades() == && UpBar == true// если нет ордеров и восходящая свеча то..
          
    {
             
    SL NormalizeDouble(Ask StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Ask TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (lastlot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_BUYlastlotAskSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
          else if(
    CountTrades() == && DownBar == true// если нет ордеров и нисходящая свеча то..
          
    {
             
    SL NormalizeDouble(Bid StopLoss*PointDigits);   // ...расчитываем стоп лосс
             
    TP NormalizeDouble(Bid TakeProfit*PointDigits); // ...расчитываем тейк профит
             
    if (lastlot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AccountFreeMargin()) // если есть деньги для открытия ордера то..
             
    ticket OrderSend(Symbol(), OP_SELLlastlotBidSlippageSLTP""MAGIC); // открываем ордер на БАЙ с удвоенным лотом
          
    }
       }
       

       return(
    0);
    }

    //+------------------------------------------------------------------+
    //| Количество открытых сделок                                       |
    //+------------------------------------------------------------------+
    int CountTrades()
    {
      
    int count 0;
      for (
    int i OrdersTotal()-1i>=0i--)
      {
        if(
    OrderSelect(i,SELECT_BY_POSMODE_TRADES))
        {
          if(
    OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
            
    count++;
        }
      }
      return(
    count);
    }

    //+------------------------------------------------------------------+
    //| Возвращает тикет последнего ордера истории                       |
    //+------------------------------------------------------------------+
    int GetLastOrderHist(int type = -1
    {
      
    int iticket = -1;
      
    datetime dt 0;
      
    int cnt OrdersHistoryTotal();
        
      for (
    int i=0cnti++) {
        if (!
    OrderSelect(iSELECT_BY_POSMODE_HISTORY)) continue;

        
    //Опционально
        
    if (OrderSymbol() != Symbol()) continue;
        if (
    OrderMagicNumber() != MAGIC) continue;
        
        if (
    type != -&& OrderType() != type) continue;
        
        if (
    OrderCloseTime() > dt) {
          
    dt OrderCloseTime();
          
    iticket OrderTicket();
        }
      }
      return (
    iticket);
    }

    //+------------------------------------------------------------------+
    //| Возвращает профит ордера истории за тикетом                      |
    //+------------------------------------------------------------------+
    double LossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double profit 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    if (iticket == -1) return(1);
       for(
    cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKET))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    profit OrderProfit(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    profit OrderProfit();
          }
       }
    //конец цикла по ордерам
       
    return(profit);
    }
    //+------------------------------------------------------------------+
    //| Возвращает лот ордера истории за тикетом                         |
    //+------------------------------------------------------------------+
    double LotLossOrder(int iticket){
    //------------вспомогательные переменные-----------
       
    int cnttotal;
       
    double lot 0;
    //-------------------------------------------------
       
    total=OrdersHistoryTotal();//общее количество рыночных и отложенных ордеров истории
       
    for(cnt=total-1;cnt>=0;cnt--)//цикл по ордерам
       
    {
          if(!
    OrderSelect(iticketSELECT_BY_TICKET))
          {
             Print(
    "Ошибка выбора ордера "GetLastError());
             return(-
    1);
          }
          if(
    OrderType()==OP_BUY)// нашли  ордер Buy
          
    {
             
    //определение убытка в пунктах для длинной позиции
             
    lot OrderLots(); 
          }
          if(
    OrderType()==OP_SELL)// нашли  ордер Sell
          
    {
             
    //определение убытка в пунктах для короткой позиции
             
    lot OrderLots();
          }
       }
    //конец цикла по ордерам
       
    return(lot);

    [свернуть]
    Да, теперь все работает отлично! Большое спасибо уважаемая TANZA. Теперь буду думать над вопросом минимального количества отрицательных сделок подряд.

    Еще за ранее хотел просто спросить, возможно ли реализовать такой алгоритм, при котором будут работать одновременно несколько советников на разных графиках, при этом, если один из советников ведет удвоенную третий раз сделку, то другие советники на своих графиках не будут удваивать свои сделки, а будут продолжать открывать ордера с тем же лотом, который был закрыт последним на их валютной паре?

    - - - Добавлено - - -

    Только что, обнаружил, что советник не работает на демо счете, если на счету меньше 500 долларов (лот 0,01), открыл новый демо счет на 1000 долларов - все работает. В чем может быть проблема?

    Вы не можете благодарить!

Страница 1 из 2 1 2 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •