Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Трал по проценту

    Привет, друзья.
    Я попытался доделать код по модификации, который взял на mql учебнике.
    Хотел сдлеать трал, который работает исключительно по процентам, без пунктов.
    И вот такие условия:
    1. Стоплос зависит от Оpenorder

    2. Тейкпрофит зависит от Openorder

    3. Трал зависит от Takeprofit. Т.е. Openorder 100 рублей, тейк выставлен 20%. Тейк сработал на 120 рублей. Включается трал. От 120 - (минус) Трал в %

    В принципе вот этот код завелся в терминале, но пишут ошибку №1 (модификация).
    Представляется мне, что код не очень.
    И скажите, здесь выполняются три условия, которые я описал выше.
    Спасибо.



    ////

    Логика такая, что сначала советник открывает пачку ордеров, но отключаться не должен от графика, поэтому видимо нужен скрипт траловый, но работающий постоянно.



    MQL код:
    //--------------------------------------------------------------------
    //--------------------------------------------------------------------
    // modifystoploss.mq4
    // Предназначен для использования в качестве примера в учебнике MQL4.
    //--------------------------------------------------------------------
    extern double Tral_Stop=0; // Дист. преследования
    extern double SL = 0;
    extern double TP = 0;
    extern double SL_PERCENT = 0.25;
    extern double TRAL_PERCENT = 0.40;
    extern double TP_PERCENT = 5.00;



    //--------------------------------------------------------------- 1 --
    int start() // Спец. функция start
    {
    string Symb=Symbol(); // Финанс. инструмент
    //--------------------------------------------------------------- 2 --
    for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
    {
    if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
    { // Анализ ордеров:
    int Tip=OrderType(); // Тип ордера
    if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер

    TP = NormalizeDouble(OrderTakeProfit(),Digits);
    // TP выбранного орд.
    double Price =OrderOpenPrice(); // Цена выбранн. орд.
    int Ticket=OrderTicket(); // Номер выбранн. орд.
    // SL выбранного орд.
    //------------------------------------------------------ 3 --
    while(true) // Цикл модификации
    {
    double TS=Tral_Stop; // Исходное значение

    //--------------------------------------------------- 4 --
    bool Modify=false; // Не назначен к модифи
    switch(Tip) // По типу ордера
    {
    case 0 : // Ордер Buy
    if (SL)
    {
    SL = NormalizeDouble(Price - (Price - SL)/100*SL_PERCENT,Digits);
    }
    if (TP)
    {
    TP = NormalizeDouble(Price +(Price + TP)/100*TP_PERCENT,Digits);
    }
    if (TS)
    {
    TS = NormalizeDouble(TS-(TP-TS)/100*TRAL_PERCENT,Digits);

    }
    if (Modify=true)
    {
    if (!OrderModify(OrderTicket(),Price,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
    }
    break; // Выход из switch
    case 1 : // Ордер Sell
    if (SL)
    {
    SL = NormalizeDouble(Price + (Price + SL)/100*SL_PERCENT,Digits);
    }
    if (TP)
    {
    TP = NormalizeDouble(Price - (Price - TP)/100*TP_PERCENT,Digits);
    }
    if (TS)
    {
    TS = NormalizeDouble(TS+(TP+TS)/100*TRAL_PERCENT,Digits);

    }
    if (Modify==true)
    {
    if (!OrderModify(OrderTicket(),Price,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
    }
    } // Конец switch
    if (Modify==false) // Если его не модифи
    break; // Выход из while
    //--------------------------------------------------- 5 --



    bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
    //--------------------------------------------------- 6 --
    if (Ans==true) // Получилось :)
    {
    Alert ("Ордер "" модифицирован:)");
    break; // Из цикла модифи.
    }
    //--------------------------------------------------- 7 --
    int Error=GetLastError(); // Не получилось :(
    switch(Error) // Преодолимые ошибки
    {
    case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
    RefreshRates(); // Обновим данные
    continue; // На след. итерацию
    case 136:Alert("Нет цен. Ждём новый тик..");
    while(RefreshRates()==false) // До нового тика
    Sleep(1); // Задержка в цикле
    continue; // На след. итерацию
    case 146:Alert("Подсистема торгов занята.Пробуем ещё");
    Sleep(500); // Простое решение
    RefreshRates(); // Обновим данные
    continue; // На след. итерацию
    // Критические ошибки
    case 2 : Alert("Общая ошибка.");
    break; // Выход из switch
    case 5 : Alert("Старая версия клиентского терминала.");
    break; // Выход из switch
    case 64: Alert("Счет заблокирован.");
    break; // Выход из switch
    case 133:Alert("Торговля запрещена");
    break; // Выход из switch
    default: Alert("Возникла ошибка ",Error);//Др. ошибки
    }
    break; // Из цикла модифи.
    } // Конец цикла модифи.
    //------------------------------------------------------ 8 --
    } // Конец анализа орд.
    } // Конец перебора орд.
    //--------------------------------------------------------------- 9 --
    return(0); // Выход из start()
    }
    //-------------------------------------------------------------- 10 --
    Последний раз редактировалось Gold; 12.10.2017, 03:48.
    https://www.forexdengi.com/group.php?groupid=434
    Закрытая группа без ограничений на высказывания.
    Принципы нестандартного подъема денег, например, сделаем бота, который будет формировать слухи, пощупаем своими свечами рынки ЮВА.
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от KhuKhu Посмотреть сообщение
    Привет, друзья.
    Я попытался доделать код по модификации, который взял на mql учебнике.
    Хотел сдлеать трал, который работает исключительно по процентам, без пунктов.
    И вот такие условия:
    1. Стоплос зависит от Оpenorder

    2. Тейкпрофит зависит от Openorder

    3. Трал зависит от Takeprofit. Т.е. Openorder 100 рублей, тейк выставлен 20%. Тейк сработал на 120 рублей. Включается трал. От 120 - (минус) Трал в %

    В принципе вот этот код завелся в терминале, но пишут ошибку №1 (модификация).
    Представляется мне, что код не очень.
    И скажите, здесь выполняются три условия, которые я описал выше.
    Спасибо.



    ////

    Логика такая, что сначала советник открывает пачку ордеров, но отключаться не должен от графика, поэтому видимо нужен скрипт траловый, но работающий постоянно.



    //--------------------------------------------------------------------
    //--------------------------------------------------------------------
    // modifystoploss.mq4
    // Предназначен для использования в качестве примера в учебнике MQL4.
    //--------------------------------------------------------------------
    extern double Tral_Stop=0; // Дист. преследования
    extern double SL = 0;
    extern double TP = 0;
    extern double SL_PERCENT = 0.25;
    extern double TRAL_PERCENT = 0.40;
    extern double TP_PERCENT = 5.00;



    //--------------------------------------------------------------- 1 --
    int start() // Спец. функция start
    {
    string Symb=Symbol(); // Финанс. инструмент
    //--------------------------------------------------------------- 2 --
    for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
    {
    if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
    { // Анализ ордеров:
    int Tip=OrderType(); // Тип ордера
    if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер

    TP = NormalizeDouble(OrderTakeProfit(),Digits);
    // TP выбранного орд.
    double Price =OrderOpenPrice(); // Цена выбранн. орд.
    int Ticket=OrderTicket(); // Номер выбранн. орд.
    // SL выбранного орд.
    //------------------------------------------------------ 3 --
    while(true) // Цикл модификации
    {
    double TS=Tral_Stop; // Исходное значение

    //--------------------------------------------------- 4 --
    bool Modify=false; // Не назначен к модифи
    switch(Tip) // По типу ордера
    {
    case 0 : // Ордер Buy
    if (SL)
    {
    SL = NormalizeDouble(Price - (Price - SL)/100*SL_PERCENT,Digits);
    }
    if (TP)
    {
    TP = NormalizeDouble(Price +(Price + TP)/100*TP_PERCENT,Digits);
    }
    if (TS)
    {
    TS = NormalizeDouble(TS-(TP-TS)/100*TRAL_PERCENT,Digits);

    }
    if (Modify=true)
    {
    if (!OrderModify(OrderTicket(),Price,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
    }
    break; // Выход из switch
    case 1 : // Ордер Sell
    if (SL)
    {
    SL = NormalizeDouble(Price + (Price + SL)/100*SL_PERCENT,Digits);
    }
    if (TP)
    {
    TP = NormalizeDouble(Price - (Price - TP)/100*TP_PERCENT,Digits);
    }
    if (TS)
    {
    TS = NormalizeDouble(TS+(TP+TS)/100*TRAL_PERCENT,Digits);

    }
    if (Modify==true)
    {
    if (!OrderModify(OrderTicket(),Price,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
    }
    } // Конец switch
    if (Modify==false) // Если его не модифи
    break; // Выход из while
    //--------------------------------------------------- 5 --



    bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
    //--------------------------------------------------- 6 --
    if (Ans==true) // Получилось
    {
    Alert ("Ордер "" модифицирован");
    break; // Из цикла модифи.
    }
    //--------------------------------------------------- 7 --
    int Error=GetLastError(); // Не получилось
    switch(Error) // Преодолимые ошибки
    {
    case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
    RefreshRates(); // Обновим данные
    continue; // На след. итерацию
    case 136:Alert("Нет цен. Ждём новый тик..");
    while(RefreshRates()==false) // До нового тика
    Sleep(1); // Задержка в цикле
    continue; // На след. итерацию
    case 146:Alert("Подсистема торгов занята.Пробуем ещё");
    Sleep(500); // Простое решение
    RefreshRates(); // Обновим данные
    continue; // На след. итерацию
    // Критические ошибки
    case 2 : Alert("Общая ошибка.");
    break; // Выход из switch
    case 5 : Alert("Старая версия клиентского терминала.");
    break; // Выход из switch
    case 64: Alert("Счет заблокирован.");
    break; // Выход из switch
    case 133:Alert("Торговля запрещена");
    break; // Выход из switch
    default: Alert("Возникла ошибка ",Error);//Др. ошибки
    }
    break; // Из цикла модифи.
    } // Конец цикла модифи.
    //------------------------------------------------------ 8 --
    } // Конец анализа орд.
    } // Конец перебора орд.
    //--------------------------------------------------------------- 9 --
    return(0); // Выход из start()
    }
    //-------------------------------------------------------------- 10 --
    Ты из своих фантазий вырвись. Напетлял конкретно.
    Проанализируй последовательно, что происходит у тебя в каждой строке по коду, и ответ на твой вопрос будет очевиден.
    То что ты книжку читаешь, это хорошо, но без понимания того что там описано, выдрав функцию из текста, свой код не сделать.

    Сделай для начала, чтобы один ордер точно тралился, не надо кучу.
    Проверь параметры этого ордера.
    Всё ли есть для того чтобы сделать расчёты.
    Перед тем как модифицировать ордер, проверь рассчитанные значения.
    Модифицируй ордер.
    Ну и так далее.
     
    Последний раз редактировалось MonyaMaker; 28.06.2017, 08:14.

    Комментарий

    • #3 Свернуть

      Сообщение от MonyaMaker Посмотреть сообщение
      Ты из своих фантазий вырвись. Напетлял конкретно.
      Проанализируй последовательно, что происходит у тебя в каждой строке по коду, и ответ на твой вопрос будет очевиден.
      То что ты книжку читаешь, это хорошо, но без понимания того что там описано, выдрав функцию из текста, свой код не сделать.

      Сделай для начала, чтобы один ордер точно тралился, не надо кучу.
      Проверь параметры этого ордера.
      Всё ли есть для того чтобы сделать расчёты.
      Перед тем как модифицировать ордер, проверь рассчитанные значения.
      Модифицируй ордер.
      Ну и так далее.
      Спасибо за совет. Я немного пофантазировал. Результат моих фантазий ниже.
      Ошибку выдает 0.
      Я иду в верном направлении?

      MQL код:
      //--------------------------------------------------------------------
      // modifystoploss.mq4
      // Предназначен для использования в качестве примера в учебнике MQL4.
      //--------------------------------------------------------------------
      extern double Tral_Stop=0; // Дист. преследования
      extern double SLoss = 0;
      extern double TProfit = 0;
      extern double SL_PERCENT = 0.02;
      extern double TRAL_PERCENT = 0.01;
      extern double TP_PERCENT = 0.02;



      //--------------------------------------------------------------- 1 --
      int start() // Спец. функция start
      {
      string Symb=Symbol(); // Финанс. инструмент
      //--------------------------------------------------------------- 2 --
      for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
      {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
      { // Анализ ордеров:
      int Tip=OrderType(); // Тип ордера
      if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер

      TProfit = NormalizeDouble(OrderTakeProfit(),Digits);
      // TP выбранного орд.
      double Price =OrderOpenPrice(); // Цена выбранн. орд.
      int Ticket=OrderTicket(); // Номер выбранн. орд.
      // SL выбранного орд.
      //------------------------------------------------------ 3 --
      while(true) // Цикл модификации
      {
      double TralS=Tral_Stop; // Исходное значение

      //--------------------------------------------------- 4 --
      bool Modify=false; // Не назначен к модифи
      switch(Tip) // По типу ордера
      {
      case 0 : // Ордер Buy
      if (SLoss)
      {
      SLoss = NormalizeDouble(Price-(Price - SLoss)/100*SL_PERCENT,Digits)>=Bid;
      }
      if (TProfit)
      {
      TProfit = NormalizeDouble(Price +(Price + TProfit)/100*TP_PERCENT,Digits)>=Bid;
      }
      if (TralS)
      {
      TralS = NormalizeDouble(Bid-(Bid-TralS)/100*TRAL_PERCENT,Digits);

      }
      if (Modify=true)
      {
      if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0, White)) Print("Error OrderModify ",GetLastError());
      }
      break; // Выход из switch
      case 1 : // Ордер Sell
      if (SLoss)
      {
      SLoss = NormalizeDouble(Price + (Price + SLoss)/100*SL_PERCENT,Digits)<=Ask;
      }
      if (TProfit)
      {
      TProfit = NormalizeDouble(Price - (Price - TProfit)/100*TP_PERCENT,Digits)<=Ask;
      }
      if (TralS)
      {
      TralS = NormalizeDouble(Ask+(Ask+TralS)/100*TRAL_PERCENT,Digits);

      }
      if (Modify==true)
      {
      if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0, White)) Print("Error OrderModify ",GetLastError());
      }
      } // Конец switch
      if (Modify==false) // Если его не модифи
      break; // Выход из while
      //--------------------------------------------------- 5 --




      //--------------------------------------------------- 6 --

      //--------------------------------------------------- 7 --
      int Error=GetLastError(); // Не получилось :(
      switch(Error) // Преодолимые ошибки
      {
      case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
      RefreshRates(); // Обновим данные
      continue; // На след. итерацию
      case 136:Alert("Нет цен. Ждём новый тик..");
      while(RefreshRates()==false) // До нового тика
      Sleep(1); // Задержка в цикле
      continue; // На след. итерацию
      case 146:Alert("Подсистема торгов занята.Пробуем ещё");
      Sleep(500); // Простое решение
      RefreshRates(); // Обновим данные
      continue; // На след. итерацию
      // Критические ошибки
      case 2 : Alert("Общая ошибка.");
      break; // Выход из switch
      case 5 : Alert("Старая версия клиентского терминала.");
      break; // Выход из switch
      case 64: Alert("Счет заблокирован.");
      break; // Выход из switch
      case 133:Alert("Торговля запрещена");
      break; // Выход из switch
      default: Alert("Возникла ошибка ",Error);//Др. ошибки
      }
      break; // Из цикла модифи.
      } // Конец цикла модифи.
      //------------------------------------------------------ 8 --
      } // Конец анализа орд.
      } // Конец перебора орд.
      //--------------------------------------------------------------- 9 --
      return(0); // Выход из start()
      }
      //-------------------------------------------------------------- 10 --


      Я так понимаю, что работать это не будет корректно, поскольку в ДЦ "отсылаются" нулевые значения Стоплоса и Тейкпрофита, а чтобы это советник заработал нужно делать лог-файл с массивом, в котором обрабатывались бы значения. Правильно? Или я ошибаюсь.
       
      Последний раз редактировалось Gold; 12.10.2017, 03:49.
      https://www.forexdengi.com/group.php?groupid=434
      Закрытая группа без ограничений на высказывания.
      Принципы нестандартного подъема денег, например, сделаем бота, который будет формировать слухи, пощупаем своими свечами рынки ЮВА.

      Комментарий

      • #4 Свернуть

        Сообщение от KhuKhu Посмотреть сообщение
        Спасибо за совет. Я немного пофантазировал. Результат моих фантазий ниже.
        Ошибку выдает 0.
        Я иду в верном направлении?

        MQL код:
        //--------------------------------------------------------------------
        // modifystoploss.mq4
        // Предназначен для использования в качестве примера в учебнике MQL4.
        //--------------------------------------------------------------------
        extern double Tral_Stop=0; // Дист. преследования
        extern double SLoss = 0;
        extern double TProfit = 0;
        extern double SL_PERCENT = 0.02;
        extern double TRAL_PERCENT = 0.01;
        extern double TP_PERCENT = 0.02;



        //--------------------------------------------------------------- 1 --
        int start() // Спец. функция start
        {
        string Symb=Symbol(); // Финанс. инструмент
        //--------------------------------------------------------------- 2 --
        for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
        {
        if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        { // Анализ ордеров:
        int Tip=OrderType(); // Тип ордера
        if(OrderSymbol()!=Symb||Tip>1)continue;// Не наш ордер

        TProfit = NormalizeDouble(OrderTakeProfit(),Digits);
        // TP выбранного орд.
        double Price =OrderOpenPrice(); // Цена выбранн. орд.
        int Ticket=OrderTicket(); // Номер выбранн. орд.
        // SL выбранного орд.
        //------------------------------------------------------ 3 --
        while(true) // Цикл модификации
        {
        double TralS=Tral_Stop; // Исходное значение

        //--------------------------------------------------- 4 --
        bool Modify=false; // Не назначен к модифи
        switch(Tip) // По типу ордера
        {
        case 0 : // Ордер Buy
        if (SLoss)
        {
        SLoss = NormalizeDouble(Price-(Price - SLoss)/100*SL_PERCENT,Digits)>=Bid;
        }
        if (TProfit)
        {
        TProfit = NormalizeDouble(Price +(Price + TProfit)/100*TP_PERCENT,Digits)>=Bid;
        }
        if (TralS)
        {
        TralS = NormalizeDouble(Bid-(Bid-TralS)/100*TRAL_PERCENT,Digits);

        }
        if (Modify=true)
        {
        if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0, White)) Print("Error OrderModify ",GetLastError());
        }
        break; // Выход из switch
        case 1 : // Ордер Sell
        if (SLoss)
        {
        SLoss = NormalizeDouble(Price + (Price + SLoss)/100*SL_PERCENT,Digits)<=Ask;
        }
        if (TProfit)
        {
        TProfit = NormalizeDouble(Price - (Price - TProfit)/100*TP_PERCENT,Digits)<=Ask;
        }
        if (TralS)
        {
        TralS = NormalizeDouble(Ask+(Ask+TralS)/100*TRAL_PERCENT,Digits);

        }
        if (Modify==true)
        {
        if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0, White)) Print("Error OrderModify ",GetLastError());
        }
        } // Конец switch
        if (Modify==false) // Если его не модифи
        break; // Выход из while
        //--------------------------------------------------- 5 --




        //--------------------------------------------------- 6 --

        //--------------------------------------------------- 7 --
        int Error=GetLastError(); // Не получилось :(
        switch(Error) // Преодолимые ошибки
        {
        case 130:Alert("Неправильные стопы. Пробуем ещё раз.");
        RefreshRates(); // Обновим данные
        continue; // На след. итерацию
        case 136:Alert("Нет цен. Ждём новый тик..");
        while(RefreshRates()==false) // До нового тика
        Sleep(1); // Задержка в цикле
        continue; // На след. итерацию
        case 146:Alert("Подсистема торгов занята.Пробуем ещё");
        Sleep(500); // Простое решение
        RefreshRates(); // Обновим данные
        continue; // На след. итерацию
        // Критические ошибки
        case 2 : Alert("Общая ошибка.");
        break; // Выход из switch
        case 5 : Alert("Старая версия клиентского терминала.");
        break; // Выход из switch
        case 64: Alert("Счет заблокирован.");
        break; // Выход из switch
        case 133:Alert("Торговля запрещена");
        break; // Выход из switch
        default: Alert("Возникла ошибка ",Error);//Др. ошибки
        }
        break; // Из цикла модифи.
        } // Конец цикла модифи.
        //------------------------------------------------------ 8 --
        } // Конец анализа орд.
        } // Конец перебора орд.
        //--------------------------------------------------------------- 9 --
        return(0); // Выход из start()
        }
        //-------------------------------------------------------------- 10 --


        Я так понимаю, что работать это не будет корректно, поскольку в ДЦ "отсылаются" нулевые значения Стоплоса и Тейкпрофита, а чтобы это советник заработал нужно делать лог-файл с массивом, в котором обрабатывались бы значения. Правильно? Или я ошибаюсь.
        Лог сам по себе нужен и массивы не лишние.
        У тебя в цикле for используется while да ещё в добавку со switch, зачем? Что ты там получить хочешь?
        Нашел ордер, проверил его параметры, если что то не устраивает, изменил, получил код возврата, его проверил.
        Это-то на кой лепить!!?
        MQL код:
        if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0,  White)) Print("Error OrderModify ",GetLastError());
        , доходя каждый раз до условия модифицировать ордер, чтобы получить код?
        И т.д. по тексту....
        Работать так как ты думаешь "это" не будет. Что он отсылает не смотрел.
        Добавлять в советник надо то, что ему не достаёт для правильной работы, правильной, это по твоему алгоритму, а то что из книги скопируешь.

        К слову, в книге не просто куски кода опубликованы, а работающий советник.
        И он работает, даже в текущих версиях MQL, с небольшими поправками.
        Логично было бы читая книгу собрать и запустить в ней описанный советник, а не просто дёргая функции из книги.
        Правильно или не правильно покажет результат твоих действий, а не чей то ответ на твой вопрос.
           
        Последний раз редактировалось Gold; 12.10.2017, 03:49.

        Комментарий

        • #5 Свернуть

          Сообщение от MonyaMaker Посмотреть сообщение
          Лог сам по себе нужен и массивы не лишние.
          У тебя в цикле for используется while да ещё в добавку со switch, зачем? Что ты там получить хочешь?
          Нашел ордер, проверил его параметры, если что то не устраивает, изменил, получил код возврата, его проверил.
          Это-то на кой лепить!!?
          MQL код:
          if (!OrderModify(OrderTicket(),Price,SLoss,TProfit,0,  White)) Print("Error OrderModify ",GetLastError());
          , доходя каждый раз до условия модифицировать ордер, чтобы получить код?
          И т.д. по тексту....
          Работать так как ты думаешь "это" не будет. Что он отсылает не смотрел.
          Добавлять в советник надо то, что ему не достаёт для правильной работы, правильной, это по твоему алгоритму, а то что из книги скопируешь.

          К слову, в книге не просто куски кода опубликованы, а работающий советник.
          И он работает, даже в текущих версиях MQL, с небольшими поправками.
          Логично было бы читая книгу собрать и запустить в ней описанный советник, а не просто дёргая функции из книги.
          Правильно или не правильно покажет результат твоих действий, а не чей то ответ на твой вопрос.
          К сожалению, я так и не смог побороть тот советник.
          Я нашел другой. Но не пойму как сделать, так чтобы "тралились" и закрывались не все ордера сразу на всех парах, а условие применялось к каждому ордеру.
          Если можете внести исправление непосредственно в код, то буду крайне признателен.
          Спасибо.
          Код.


          MQL код:
          extern double percent_of_profit =33; ///
          extern double minimum_profit = 1.04;/// в процентах
          double profit,profit_off,result;
          bool trail_enable=false,close_start=false;
          int ticket;
          int init()
          {
          profit_off=0;
          result = 0;
          Comment ("");
          return(0);
          }

          int start()
          {
          while (IsExpertEnabled())
          {
          Sleep (50);
          RefreshRates();
          //----
          if (close_start)
          {
          for (int i=0; i<OrdersTotal(); i++)

          {
          ticket=OrderSelect (i,SELECT_BY_POS,MODE_TRADES);

          {
          if (OrderType()==OP_BUY)
          {
          double price = MarketInfo (OrderSymbol(),MODE_BID);
          ticket=OrderClose (OrderTicket(),OrderLots(),price,3,0);
          result = OrderProfit()+result;
          }
          if (OrderType()==OP_SELL)
          {
          price = MarketInfo (OrderSymbol(),MODE_ASK);
          ticket=OrderClose (OrderTicket(),OrderLots(),price,3,0);
          result = OrderProfit()+result;
          }
          }
          }
          }

          {
          ticket=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
          profit = OrderProfit()+OrderSwap()+profit;
          }
          if (close_start&&OrdersTotal()==0)
          {
          trail_enable=false;
          close_start= false;
          Alert ("Советник закрыл позиции с результатом ", result);
          profit_off=0;
          result = 0;
          }
          if (!trail_enable&&OrdersTotal()!=0)

          {
          Comment ("Режим трала выключен." ,"\n","Советник начнет сопровождать ордера при росте прибыли до ",minimum_profit,
          " текущая прибыль ", profit);
          }
          if ((profit_off==0&&OrderOpenPrice()*minimum_profit < profit)||(profit_off!=0&&profit_off<profit-profit*(percent_of_profit/100)))
          {
          trail_enable=true;
          profit_off=profit-profit*(percent_of_profit/100);
          Comment("Режим трала включен." ,"\n","Советник закроет ордера при падении прибыли до ",profit_off,
          " максимальная прибыль ", profit);
          }
          if (trail_enable&&profit_off>profit)
          {
          close_start=true;
          }
          profit =0;
          }
          //----
          return(0);
          }
          //+------------------------------------------------------------------+----------+
             
          Последний раз редактировалось Gold; 12.10.2017, 03:49.
          https://www.forexdengi.com/group.php?groupid=434
          Закрытая группа без ограничений на высказывания.
          Принципы нестандартного подъема денег, например, сделаем бота, который будет формировать слухи, пощупаем своими свечами рынки ЮВА.

          Комментарий

          • #6 Свернуть

            Сообщение от KhuKhu Посмотреть сообщение
            К сожалению, я так и не смог побороть тот советник.
            Я нашел другой. Но не пойму как сделать, так чтобы "тралились" и закрывались не все ордера сразу на всех парах, а условие применялось к каждому ордеру.
            Если можете внести исправление непосредственно в код, то буду крайне признателен.
            Спасибо.
            Код.


            MQL код:
            extern double percent_of_profit =33; ///
            extern double minimum_profit = 1.04;/// в процентах
            double profit,profit_off,result;
            bool trail_enable=false,close_start=false;
            int ticket;
            int init()
            {
            profit_off=0;
            result = 0;
            Comment ("");
            return(0);
            }

            int start()
            {
            while (IsExpertEnabled())
            {
            Sleep (50);
            RefreshRates();
            //----
            if (close_start)
            {
            for (int i=0; i<OrdersTotal(); i++)

            {
            ticket=OrderSelect (i,SELECT_BY_POS,MODE_TRADES);

            {
            if (OrderType()==OP_BUY)
            {
            double price = MarketInfo (OrderSymbol(),MODE_BID);
            ticket=OrderClose (OrderTicket(),OrderLots(),price,3,0);
            result = OrderProfit()+result;
            }
            if (OrderType()==OP_SELL)
            {
            price = MarketInfo (OrderSymbol(),MODE_ASK);
            ticket=OrderClose (OrderTicket(),OrderLots(),price,3,0);
            result = OrderProfit()+result;
            }
            }
            }
            }

            {
            ticket=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            profit = OrderProfit()+OrderSwap()+profit;
            }
            if (close_start&&OrdersTotal()==0)
            {
            trail_enable=false;
            close_start= false;
            Alert ("Советник закрыл позиции с результатом ", result);
            profit_off=0;
            result = 0;
            }
            if (!trail_enable&&OrdersTotal()!=0)

            {
            Comment ("Режим трала выключен." ,"\n","Советник начнет сопровождать ордера при росте прибыли до ",minimum_profit,
            " текущая прибыль ", profit);
            }
            if ((profit_off==0&&OrderOpenPrice()*minimum_profit < profit)||(profit_off!=0&&profit_off<profit-profit*(percent_of_profit/100)))
            {
            trail_enable=true;
            profit_off=profit-profit*(percent_of_profit/100);
            Comment("Режим трала включен." ,"\n","Советник закроет ордера при падении прибыли до ",profit_off,
            " максимальная прибыль ", profit);
            }
            if (trail_enable&&profit_off>profit)
            {
            close_start=true;
            }
            profit =0;
            }
            //----
            return(0);
            }
            //+------------------------------------------------------------------+----------+
            К сожалению, я так и не смог побороть тот советник.
            Ты думаешь, что не разобравшись с одним, и взяв другой кусок кода ты с ним разберешься?
            Я нашел другой. Но не пойму как сделать, так чтобы "тралились" и закрывались не все ордера сразу на всех парах, а условие применялось к каждому ордеру.
            Для того чтобы тралились и закрывались выбранные ордера, надо использовать соответствующий фильтр или проверку при переборе ордеров соответственно.
            Например:

            MQL код:

            тут какой то массивчик объявили, куда итоги обработки ордеров записывать
            if (OrderSelect(...)){
            if (Symbol() == OrderSymbol() ) {
            ...
            if ( PROFIT_CTRL_LEVEL < OrderProfitl() ) {
            ...Тут делаем OrderModify() переводим ордер в безубыток, или закрываем.
            }
            }
            }
            Тут прошлись по массивчику и выполнили операции над отобранными данными


            и так дальше с каждым параметром, который задействован в стратегии, или на что то влияет.

            Если можете внести исправление непосредственно в код, то буду крайне признателен.
            Вносить изменения, это переписать всё.
               
            Последний раз редактировалось Gold; 12.10.2017, 03:50.

            Комментарий

            • #7 Свернуть

              Сообщение от MonyaMaker Посмотреть сообщение
              Ты думаешь, что не разобравшись с одним, и взяв другой кусок кода ты с ним разберешься?

              Для того чтобы тралились и закрывались выбранные ордера, надо использовать соответствующий фильтр или проверку при переборе ордеров соответственно.
              Например:

              MQL код:

              тут какой то массивчик объявили, куда итоги обработки ордеров записывать
              if (OrderSelect(...)){
              if (Symbol() == OrderSymbol() ) {
              ...
              if ( PROFIT_CTRL_LEVEL < OrderProfitl() ) {
              ...Тут делаем OrderModify() переводим ордер в безубыток, или закрываем.
              }
              }
              }
              Тут прошлись по массивчику и выполнили операции над отобранными данными


              и так дальше с каждым параметром, который задействован в стратегии, или на что то влияет.


              Вносить изменения, это переписать всё.
              Я отправил сообщение в л/с.
              И вот здесь я ошибся.
              OrderOpenPrice()*minimum_profit
              Правильнее видимо будет так - lots*500"кредитное плечо"*OrderOpenPrice()*minimum_profit
               
              https://www.forexdengi.com/group.php?groupid=434
              Закрытая группа без ограничений на высказывания.
              Принципы нестандартного подъема денег, например, сделаем бота, который будет формировать слухи, пощупаем своими свечами рынки ЮВА.

              Комментарий

              • #8 Свернуть

                Сообщение от MonyaMaker Посмотреть сообщение
                Ты из своих фантазий вырвись. Напетлял конкретно.
                Проанализируй последовательно, что происходит у тебя в каждой строке по коду, и ответ на твой вопрос будет очевиден.
                То что ты книжку читаешь, это хорошо, но без понимания того что там описано, выдрав функцию из текста, свой код не сделать.

                Сделай для начала, чтобы один ордер точно тралился, не надо кучу.
                Проверь параметры этого ордера.
                Всё ли есть для того чтобы сделать расчёты.
                Перед тем как модифицировать ордер, проверь рассчитанные значения.
                Модифицируй ордер.
                Ну и так далее.


                Друг извини что вклинился... - может ты подскажешь как вставить алерт в этот индикатор, если ты в этом волокёшь:
                MQL код:
                //+------------------------------------------------------------------+
                //| Butterfly.mq4 |
                //| Copyright © 2006, Archer Trading, LLC |
                //| [url]http://www.archertrading.net[/url] |
                //+------------------------------------------------------------------+
                #property copyright "Copyright © 2006, Archer Trading, LLC"
                #property link "http://www.archertrading.net"

                #property indicator_chart_window
                #property indicator_buffers 2
                #property indicator_color1 Lime
                #property indicator_width1 3
                #property indicator_color2 OrangeRed
                #property indicator_width2 3
                //---- indicator parameters
                extern int ExtDepth=32;
                extern int ExtDeviation=3;
                extern int ExtBackstep=12;
                //---- indicator buffers
                double ExtMapBuffer[];
                double ExtMapBuffer2[];

                //+------------------------------------------------------------------+
                //| Custom indicator initialization function |
                //+------------------------------------------------------------------+
                int init()
                {
                IndicatorBuffers(2);
                //---- drawing settings
                SetIndexStyle(0,DRAW_ARROW,EMPTY,2);
                SetIndexArrow(0,217);
                SetIndexStyle(1,DRAW_ARROW,EMPTY,2);
                SetIndexArrow(1,218);

                //---- indicator buffers mapping
                SetIndexBuffer(0,ExtMapBuffer);
                SetIndexBuffer(1,ExtMapBuffer2);
                SetIndexEmptyValue(0,0.0);
                ArraySetAsSeries(ExtMapBuffer,true);
                ArraySetAsSeries(ExtMapBuffer2,true);
                //---- indicator short name
                IndicatorShortName("ZigZag("+ExtDepth+","+ExtDevia tion+","+ExtBackstep+")");
                //---- initialization done
                return(0);
                }
                //+------------------------------------------------------------------+
                //| |
                //+------------------------------------------------------------------+
                int start()
                {
                int shift, back,lasthighpos,lastlowpos;
                double val,res;
                double curlow,curhigh,lasthigh,lastlow;

                for(shift=Bars-ExtDepth; shift>=0; shift--)
                {
                val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
                if(val==lastlow) val=0.0;
                else
                {
                lastlow=val;
                if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
                else
                {
                for(back=1; back<=ExtBackstep; back++)
                {
                res=ExtMapBuffer[shift+back];
                if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
                }
                }
                }
                ExtMapBuffer[shift]=val;
                //--- high
                val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
                if(val==lasthigh) val=0.0;
                else
                {
                lasthigh=val;
                if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
                else
                {
                for(back=1; back<=ExtBackstep; back++)
                {
                res=ExtMapBuffer2[shift+back];
                if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
                }
                }
                }
                ExtMapBuffer2[shift]=val;
                }

                // final cutting
                lasthigh=-1; lasthighpos=-1;
                lastlow=-1; lastlowpos=-1;

                for(shift=Bars-ExtDepth; shift>=0; shift--)
                {
                curlow=ExtMapBuffer[shift];
                curhigh=ExtMapBuffer2[shift];
                if((curlow==0)&&(curhigh==0)) continue;
                //---
                if(curhigh!=0)
                {
                if(lasthigh>0)
                {
                if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
                else ExtMapBuffer2[shift]=0;
                }
                //---
                if(lasthigh<curhigh || lasthigh<0)
                {
                lasthigh=curhigh;
                lasthighpos=shift;
                }
                lastlow=-1;
                }
                //----
                if(curlow!=0)
                {
                if(lastlow>0)
                {
                if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
                else ExtMapBuffer[shift]=0;
                }
                //---
                if((curlow<lastlow)||(lastlow<0))
                {
                lastlow=curlow;
                lastlowpos=shift;
                }
                lasthigh=-1;
                }
                }

                for(shift=Bars-1; shift>=0; shift--)
                {
                if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
                else
                {
                res=ExtMapBuffer2[shift];
                if(res!=0.0) ExtMapBuffer[shift]=res;
                }
                }
                }
                 
                Последний раз редактировалось Gold; 12.10.2017, 03:50.

                Комментарий

                • #9 Свернуть

                  Сообщение от Legion167273 Посмотреть сообщение
                  Друг извини что вклинился... - может ты подскажешь как вставить алерт в этот индикатор, если ты в этом волокёшь:
                  MQL код:
                  //+------------------------------------------------------------------+
                  //| Butterfly.mq4 |
                  //| Copyright © 2006, Archer Trading, LLC |
                  //| [url]http://www.archertrading.net[/url] |
                  //+------------------------------------------------------------------+
                  #property copyright "Copyright © 2006, Archer Trading, LLC"
                  #property link "http://www.archertrading.net"

                  #property indicator_chart_window
                  #property indicator_buffers 2
                  #property indicator_color1 Lime
                  #property indicator_width1 3
                  #property indicator_color2 OrangeRed
                  #property indicator_width2 3
                  //---- indicator parameters
                  extern int ExtDepth=32;
                  extern int ExtDeviation=3;
                  extern int ExtBackstep=12;
                  //---- indicator buffers
                  double ExtMapBuffer[];
                  double ExtMapBuffer2[];

                  //+------------------------------------------------------------------+
                  //| Custom indicator initialization function |
                  //+------------------------------------------------------------------+
                  int init()
                  {
                  IndicatorBuffers(2);
                  //---- drawing settings
                  SetIndexStyle(0,DRAW_ARROW,EMPTY,2);
                  SetIndexArrow(0,217);
                  SetIndexStyle(1,DRAW_ARROW,EMPTY,2);
                  SetIndexArrow(1,218);

                  //---- indicator buffers mapping
                  SetIndexBuffer(0,ExtMapBuffer);
                  SetIndexBuffer(1,ExtMapBuffer2);
                  SetIndexEmptyValue(0,0.0);
                  ArraySetAsSeries(ExtMapBuffer,true);
                  ArraySetAsSeries(ExtMapBuffer2,true);
                  //---- indicator short name
                  IndicatorShortName("ZigZag("+ExtDepth+","+ExtDevia tion+","+ExtBackstep+")");
                  //---- initialization done
                  return(0);
                  }
                  //+------------------------------------------------------------------+
                  //| |
                  //+------------------------------------------------------------------+
                  int start()
                  {
                  int shift, back,lasthighpos,lastlowpos;
                  double val,res;
                  double curlow,curhigh,lasthigh,lastlow;

                  for(shift=Bars-ExtDepth; shift>=0; shift--)
                  {
                  val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
                  if(val==lastlow) val=0.0;
                  else
                  {
                  lastlow=val;
                  if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
                  else
                  {
                  for(back=1; back<=ExtBackstep; back++)
                  {
                  res=ExtMapBuffer[shift+back];
                  if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
                  }
                  }
                  }
                  ExtMapBuffer[shift]=val;
                  //--- high
                  val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
                  if(val==lasthigh) val=0.0;
                  else
                  {
                  lasthigh=val;
                  if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
                  else
                  {
                  for(back=1; back<=ExtBackstep; back++)
                  {
                  res=ExtMapBuffer2[shift+back];
                  if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
                  }
                  }
                  }
                  ExtMapBuffer2[shift]=val;
                  }

                  // final cutting
                  lasthigh=-1; lasthighpos=-1;
                  lastlow=-1; lastlowpos=-1;

                  for(shift=Bars-ExtDepth; shift>=0; shift--)
                  {
                  curlow=ExtMapBuffer[shift];
                  curhigh=ExtMapBuffer2[shift];
                  if((curlow==0)&&(curhigh==0)) continue;
                  //---
                  if(curhigh!=0)
                  {
                  if(lasthigh>0)
                  {
                  if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
                  else ExtMapBuffer2[shift]=0;
                  }
                  //---
                  if(lasthigh<curhigh || lasthigh<0)
                  {
                  lasthigh=curhigh;
                  lasthighpos=shift;
                  }
                  lastlow=-1;
                  }
                  //----
                  if(curlow!=0)
                  {
                  if(lastlow>0)
                  {
                  if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
                  else ExtMapBuffer[shift]=0;
                  }
                  //---
                  if((curlow<lastlow)||(lastlow<0))
                  {
                  lastlow=curlow;
                  lastlowpos=shift;
                  }
                  lasthigh=-1;
                  }
                  }

                  for(shift=Bars-1; shift>=0; shift--)
                  {
                  if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
                  else
                  {
                  res=ExtMapBuffer2[shift];
                  if(res!=0.0) ExtMapBuffer[shift]=res;
                  }
                  }
                  }
                  Для начала в справочнике по MQL4 найди, Alert(), потом, определись с тем, что ты в него будешь писать, чтобы он выводил это в своё окно.
                  Дальше, всё просто, в тех местах индикатора значения которых ты хочешь посмотреть вставляешь Alert(значение, ....., ....... );.
                  Только учти, что в зависимости от места, куда ты вставишь алерт, значений может быть очень много и алерт получится оооочень длинный.
                     
                  Последний раз редактировалось Gold; 12.10.2017, 03:51.

                  Комментарий

                  • #10 Свернуть

                    К своему сожалению, я не понимаю причём здесь "...определись с тем, что ты в него будешь писать, чтобы он выводил это в своё окно. " Я понимаю что в этом есть какой-то смысл, но не понятно куда писать - в открытый код алерта, или в открытый код индикатора, или в какое другое место? Да и ладно, если бы даже и разобрался, как мне нужно разобраться с тем, что нужно писать?... - Короче тайна... - Мне обыкновенно то и нужно только чтобы после того как на графике движения валютной пары нарисуется фрактал, чтобы сработал любой сигнал - хоть длинный, хоть короткий... Братец вставь в открытый код индикатора который я выложил любой сигнал если тебе не тяжело, буду очень признателен. - Я бы его просто скопировал, вставил, закомпелировал и сохранил.
                       

                    Комментарий

                    • #11 Свернуть

                      Сообщение от Legion167273 Посмотреть сообщение
                      К своему сожалению, я не понимаю причём здесь "...определись с тем, что ты в него будешь писать, чтобы он выводил это в своё окно. " Я понимаю что в этом есть какой-то смысл, но не понятно куда писать - в открытый код алерта, или в открытый код индикатора, или в какое другое место? Да и ладно, если бы даже и разобрался, как мне нужно разобраться с тем, что нужно писать?... - Короче тайна... - Мне обыкновенно то и нужно только чтобы после того как на графике движения валютной пары нарисуется фрактал, чтобы сработал любой сигнал - хоть длинный, хоть короткий... Братец вставь в открытый код индикатора который я выложил любой сигнал если тебе не тяжело, буду очень признателен. - Я бы его просто скопировал, вставил, закомпелировал и сохранил.
                      Смотри, Alert(), это буквами и цифрами на экран, чтобы не эмоциями, а потенциалом, а звуковой сигнал, это просто бипнуть, и дальше бипать, пока обновляется "фрактал", на самом деле не фрактал, а экстремум. Потом бипать продолжит, когда сформируется противоположенный, и бипать будет другими звуком.
                      И давай не так жалобно, а то читалы расплачатся.

                      Не хочу тебя разочаровывать, но твоя надежда с механизмом оповещения, не оправдается. Разве, что ты организуешь три дежурных смены.
                       
                      Последний раз редактировалось MonyaMaker; 06.07.2017, 19:58.

                      Комментарий

                      • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                      • #12 Свернуть

                        Сообщение от MonyaMaker Посмотреть сообщение
                        Смотри, Alert(), это буквами и цифрами на экран, чтобы не эмоциями, а потенциалом, а звуковой сигнал, это просто бипнуть, и дальше бипать, пока обновляется "фрактал", на самом деле не фрактал, а экстремум. Потом бипать продолжит, когда сформируется противоположенный, и бипать будет другими звуком.
                        И давай не так жалобно, а то читалы расплачатся.

                        Не хочу тебя разочаровывать, но твоя надежда с механизмом оповещения, не оправдается. Разве, что ты организуешь три дежурных смены.
                        Это был ПОСЛЕДНИЙ шанс!!!!!! - Три дежурных смены!
                         

                        Комментарий

                        Сейчас онлайн

                        working...
                        X