Logo

Вход

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

    Мой советник, двигающий цену открытия для sellstop, baystop на определенном шаге

    Прошу посмотреть оценить мой советник, в задачу которого входит двигать открытия цену для отложенных ордеров sellstop, baystop, и при необходимости двигать профит(значение меньше нуля- не двигать), при Message=0 сообщения отключаются.
    Это мой первый советник (за основу взят пример по изменению стоплоста http://book.mql4.com/ru/trading/ordermodify ), поэтому прошу не сильно критиковать, только дельное.

    MQL код:

    //--------------------------------------------------------------------
    // |move orders sellstop and bay stop |
    //--------------------------------------------------------------------
    extern int Tral_Step=15; // Дист. преследования, шаг в пунктах
    extern int Tral_Profit=20; // Дистанция изменения профита, 0-не менять
    extern bool Message=1; // показывать сообщения (1- да, 0-нет)
    //--------------------------------------------------------------- 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<4)continue;// Не наш ордер

    double OldPrice=OrderOpenPrice(); // тип выбранного отложеннного ордера (покупка/продажа)
    //------------------------------------------------------ 3 --
    while(true) // Цикл модификации
    {
    double TS=Tral_Step; // Исходное значение
    int Spred=MarketInfo(Symb,MODE_SPREAD); // спред
    int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);//Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
    if(TS<Min_Dist) // Если меньше допуст.
    TS=Min_Dist; // Новое значение TS
    //--------------------------------------------------- 4 --
    bool Modify=false; // Не назначен к модифи
    switch(Tip) // По типу ордера
    {
    case 4 : // Ордер BUY STOP
    if(NormalizeDouble(OldPrice,Digits)>// Если ниже желаем.
    NormalizeDouble(Bid+TS*Point,Digits))
    {
    double NewPrice=Bid+TS*Point; // то модифицируем его цену и профит

    double NewProfit=OrderProfit(); //получение текущего профита
    if(Tral_Profit>0)
    { // Дистанция изменения профита в пунктах, 0-не менять
    if(Tral_Profit < Min_Dist)
    { // Если меньше допуст.
    Tral_Profit=Min_Dist; // Новое значение
    }
    NewProfit=NewPrice+Tral_Profit*Point+Spred*Point;// меняем профит
    }

    string Text="BUY STOP "; // Текст для BUY STOP
    Modify=true; // Назначен к модифи.
    }
    break; // Выход из switch
    case 5 : // Ордер SELL STOP
    if(NormalizeDouble(OldPrice,Digits)<// Если выше желаем.
    NormalizeDouble(Ask-TS*Point,Digits))
    {
    NewPrice=Ask-TS*Point; // то модифицируем его

    NewProfit=OrderProfit(); //получение текущего профита
    if(Tral_Profit>0)
    { // Дистанция изменения профита в пунктах, 0-не менять
    if(Tral_Profit < Min_Dist)
    { // Если меньше допуст.
    Tral_Profit=Min_Dist; // Новое значение
    }
    NewProfit=NewPrice-Tral_Profit*Point-Spred*Point;// меняем профит
    }

    Text="SELL STOP "; // Текст для SELL STOP
    Modify=true; // Назначен к модифи.
    }
    } // Конец switch

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


    Последний раз редактировалось Sergey444; 07.10.2014, 17:44.
    Лучше воробей в руке, чем журавль в небе
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    в общем это со временем будет одна из функций моего будущего советника, который будет сам торговать.

    Я обнаружил в нем периодически возникающую ошибку 4109, в сообщениях( включенных), это означает что торговля запрещена, но это не обьясняет мне ничего. Может подскажете?
     
    Лучше воробей в руке, чем журавль в небе

    Комментарий

    • #3 Свернуть

      Сообщение от Sergey444 Посмотреть сообщение
      Может подскажете?
      Обычно ДЦ запрещают торговлю советнику, отправляющему большое количество запросов. И ещё, не надо переписывать
      чужой бред, а лучше написать свой, по крайней мере при написании идёт осмысливание каждой строчки кода. И ещё,
      не учитывается уровень ДЦ по уровню заморозки.
       
      Последний раз редактировалось cgon; 07.10.2014, 21:41.

      Комментарий

      • #4 Свернуть

        Сообщение от cgon Посмотреть сообщение
        Обычно ДЦ запрещают торговлю советнику, отправляющему большое количество запросов. И ещё, не надо переписывать
        чужой бред, а лучше написать свой, по крайней мере при написании идёт осмысливание каждой строчки кода. И ещё,
        не учитывается уровень ДЦ по уровню заморозки.

        что это такое "уровень заморозки"?
           
        Лучше воробей в руке, чем журавль в небе

        Комментарий

        • #5 Свернуть

          Сообщение от Sergey444 Посмотреть сообщение
          что это такое "уровень заморозки"?
          Почитай в той же главе, где взял образец советника, чуть пониже.
          (см. Требования и ограничения торговых операций).
             

          Комментарий

          • #6 Свернуть

            Сообщение от cgon Посмотреть сообщение
            Обычно ДЦ запрещают торговлю советнику, отправляющему большое количество запросов. И ещё, не надо переписывать
            чужой бред, а лучше написать свой, по крайней мере при написании идёт осмысливание каждой строчки кода. И ещё,
            не учитывается уровень ДЦ по уровню заморозки.

            подскажи пожалуйста, как бы сам написал данный советник? Я понимаю что ты хорошо разбираешься в MQL4.
               
            Лучше воробей в руке, чем журавль в небе

            Комментарий

            • #7 Свернуть

              Сообщение от Sergey444 Посмотреть сообщение
              подскажи пожалуйста, как бы сам написал данный советник? Я понимаю что ты хорошо разбираешься в MQL4.
              Советник проще собирать из готовых функций, чем писать от начала до конца. А самих функций не так уж и много. Только сами
              функции очистите от не нужного мусора. А то обычно их пытаются писать одну на все случаи. Если нужно двигать стоп ордера за
              ценой, то вот пример:
              MQL код:

              //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              // тралл открытых ордеров SELLSTOP и BUYSTOP
              void TRALL(int mag,int t_S,int shag4){

              double open;
              for (int i=0; i<=OrdersTotal(); i++)
              {
              if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
              if(OrderMagicNumber()!=mag)continue;
              open=OrderOpenPrice();
              //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
              if (OrderType()==OP_SELLSTOP)
              {
              if(open < Bid - t_S*Point) {
              if(OrderModify(OrderTicket(),NormalizeDouble((open +shag4*Point),Digits),0,0,0,Purple))continue;
              }}
              //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
              if ((OrderType()==OP_BUYSTOP))
              {
              //================================================== ==================
              if(open > Ask + t_S*Point){
              if(OrderModify(OrderTicket(),NormalizeDouble((open-shag4*Point),Digits),0,0,0,DarkGreen))continue;
              }}}
              return;
              }//TRALL тралл открытых ордеров SELLSTOP и BUYSTOP
              //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                 

              Комментарий

              • #8 Свернуть

                cgon, Там есть учебник по MQL4 в формате chm.
                Какой программой он открывается?
                 

                Комментарий

                • #9 Свернуть

                  Сообщение от cgon Посмотреть сообщение
                  Советник проще собирать из готовых функций, чем писать от начала до конца. А самих функций не так уж и много. Только сами
                  функции очистите от не нужного мусора. А то обычно их пытаются писать одну на все случаи. Если нужно двигать стоп ордера за
                  ценой, то вот пример:
                  MQL код:

                  //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                  // тралл открытых ордеров SELLSTOP и BUYSTOP
                  void TRALL(int mag,int t_S,int shag4){

                  double open;
                  for (int i=0; i<=OrdersTotal(); i++)
                  {
                  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
                  if(OrderMagicNumber()!=mag)continue;
                  open=OrderOpenPrice();
                  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                  if (OrderType()==OP_SELLSTOP)
                  {
                  if(open < Bid - t_S*Point) {
                  if(OrderModify(OrderTicket(),NormalizeDouble((open +shag4*Point),Digits),0,0,0,Purple))continue;
                  }}
                  //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                  if ((OrderType()==OP_BUYSTOP))
                  {
                  //================================================== ==================
                  if(open > Ask + t_S*Point){
                  if(OrderModify(OrderTicket(),NormalizeDouble((open-shag4*Point),Digits),0,0,0,DarkGreen))continue;
                  }}}
                  return;
                  }//TRALL тралл открытых ордеров SELLSTOP и BUYSTOP
                  //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                  а где можно достать эти готовые функции, есть где-то сборник ?
                     
                  Лучше воробей в руке, чем журавль в небе

                  Комментарий

                  • #10 Свернуть

                    Сообщение от venbat Посмотреть сообщение
                    cgon, Там есть учебник по MQL4 в формате chm.
                    Какой программой он открывается?
                    открывается встроенной в виндовс программой, если у тебя не открывается, то читай решение проблемы http://c-t-s.ru/ext/chm.html

                    или просто выполни команду, ПУСК\ВЫПОЛНИТЬ... и запусти в открывшемся окне
                    MQL код:

                    regsvr32 %windir%\system32\hhctrl.ocx


                    после этого файл должен открываться
                       
                    Последний раз редактировалось Sergey444; 10.10.2014, 18:37.
                    Лучше воробей в руке, чем журавль в небе

                    Комментарий

                    • #11 Свернуть

                      Sergey444, И так и этак делал ничего не получается.
                      Файл открывается а там все пусто ничего нет.
                         

                      Комментарий

                      • #12 Свернуть

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

                        Комментарий

                        • #13 Свернуть

                          Сообщение от venbat Посмотреть сообщение
                          Sergey444, И так и этак делал ничего не получается.
                          Файл открывается а там все пусто ничего нет.
                          во первых, проверь скачался ли он полностью, у меня он занимает 1,68 МБ (1 770 663 байт)
                          во вторых, какая у тебя операционная система, и если можно покажи что ты видишь(копию экрана)
                             
                          Лучше воробей в руке, чем журавль в небе

                          Комментарий

                          • #14 Свернуть

                            Sergey444,
                            Да вроде скачался.1.7мб
                               

                            Комментарий

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

                              Сообщение от cgon Посмотреть сообщение
                              //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                              // тралл открытых ордеров SELLSTOP и BUYSTOP
                              void TRALL(int mag,int t_S,int shag4){

                              double open;
                              for (int i=0; i<=OrdersTotal(); i++)
                              {
                              if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
                              if(OrderMagicNumber()!=mag)continue;
                              open=OrderOpenPrice();
                              //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                              if (OrderType()==OP_SELLSTOP)
                              {
                              if(open < Bid - t_S*Point) {
                              if(OrderModify(OrderTicket(),NormalizeDouble((open +shag4*Point),Digits),0,0,0,Purple))continue;
                              }}
                              //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                              if ((OrderType()==OP_BUYSTOP))
                              {
                              //================================================== ==================
                              if(open > Ask + t_S*Point){
                              if(OrderModify(OrderTicket(),NormalizeDouble((open-shag4*Point),Digits),0,0,0,DarkGreen))continue;
                              }}}
                              return;
                              }//TRALL тралл открытых ордеров SELLSTOP и BUYSTOP
                              а после какого блока это вставить?
                                 

                              Комментарий

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

                              working...
                              X