Помогите, что не так с кодом? Не закрывает по 2 ордера
Показано с 1 по 10 из 10

Тема: Помогите, что не так с кодом? Не закрывает по 2 ордера

  1. #1
    Местный
    Регистрация
    27.09.2018
    Сообщений
    11
    Благодарности
    Получено: 0
    Отправлено: 0

    Помогите, что не так с кодом? Не закрывает по 2 ордера

    Нужно чтобы открывались 4 новых ордера после того как из предыдущих 4х ордеров закроются 2 заранее выбранных ордера(SYMBOL1 и SYMBOL2 или SYMBOL3 и SYMBOL4). А 2 этих ордера(SYMBOL1 и SYMBOL2 или SYMBOL3 и SYMBOL4) закрываются при определенной сумме профита(SYMBOL1 + SYMBOL2 или SYMBOL3 + SYMBOL4) соответственно. то есть 4 ордера разделены на 2 пары (SYMBOL1 + SYMBOL2 и SYMBOL3 + SYMBOL4). если какие 2 определенных ордера выходят в профит, то закрываются и открывается новая 4ка ордеров. а которые за следом потом выйдут в профит 2 ордера, они не учитываются для открытия новой 4ки ордеров, а просто закрываются по профиту. и так по новой. начало самого первого открытия 4х ордеров начинается с момента установки советника на график.

    Допустим открыты 4 ордера, это: buy EURUSD(-2$); sell GBPUSD(+12$); buy EURGBP(-6$); sell GBPJPY(-2$). Общий профит стоит 10$. Советник должен закрыть: buy EURUSD(-2$) и sell GBPUSD(+12$) (SYMBOL1 + SYMBOL2=общий профит)(SYMBOL3 + SYMBOL4= убыток. их пока не закрывает а ждет когда в профит выйдут).
    Код:
    //+------------------------------------------------------------------+
    //|         Советник, выставляет 4 ордера по 4м валютам              |
    //+------------------------------------------------------------------+
    #property strict
    //+------------------------------------------------------------------+
    extern string  SYMBOL1        = "EURUSD"; //первый символ, если не указан, то не выставляется
    extern string  SYMBOL2        = "GBPUSD"; //второй символ, если не указан, то не выставляется
    extern string  SYMBOL3        = "EURGBP"; //третий символ, если не указан, то не выставляется
    extern string  SYMBOL4        = "GBPJPY"; //четвертый символ, если не указан, то не выставляется
    extern double  LOT1           = 0.1;      //лот первого инструмента
    extern double  LOT2           = 0.1;      //лот второго инструмента
    extern double  LOT3           = 0.1;      //лот третьего инструмента
    extern double  LOT4           = 0.1;      //лот четвертого инструмента
    extern int     TYPE1          = OP_BUY;   //тип ордера первого инструмента
    extern int     TYPE2          = OP_SELL;  //тип ордера второго инструмента
    extern int     TYPE3          = OP_BUY;   //тип ордера третьего инструмента
    extern int     TYPE4          = OP_SELL;  //тип ордера четвертого инструмента
    extern int     Slippage       = 30;       //проскальзывание 
    extern double  obpr           = 10;       //Общий профит
    extern int     Magic          = 777888;
    
    //============================================================================
    void start()
      {
       double pa1=0, pa2=0;
       int i;
       int p1=0,p2=0;
       for(i=OrdersTotal()-1; i>=0; i--)
         {//Проверяем профит
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic)
           {//Подсчитываем общий профит
            if(p1<=2 && (OrderSymbol()==SYMBOL1 || OrderSymbol()==SYMBOL2)) {pa1=pa1+OrderProfit()+OrderSwap()+OrderCommission(); p1++;}
            if(p2<=2 && (OrderSymbol()==SYMBOL3 || OrderSymbol()==SYMBOL4)) {pa2=pa2+OrderProfit()+OrderSwap()+OrderCommission(); p2++;}
           }
         }
       if(pa1>=obpr) close_orders(1); //Закрываем две пары, если они в сумме >= общему профиту
       if(pa2>=obpr) close_orders(2);
       
       int s=0;
       for(i=OrdersTotal()-1; i>=0; i--)
         {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic) s++;
         }
       if(s>2) return;
    
       int    Digit=(int)MarketInfo(SYMBOL1,MODE_DIGITS);
       double Poin=MarketInfo(SYMBOL1,MODE_POINT);
       double ASK=NormalizeDouble(MarketInfo(SYMBOL1,MODE_ASK),Digit);
       double BID=NormalizeDouble(MarketInfo(SYMBOL1,MODE_BID),Digit);
       if(SYMBOL1!="")
         {
          if(TYPE1==OP_BUY)
            {
             if(OrderSend(SYMBOL1,OP_BUY,LOT1,ASK,Slippage,0,0,"1й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер BUY  лот ",LOT1," ",SYMBOL1);
             else Alert(SYMBOL1," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);
            }
          if(TYPE1==OP_SELL)
            {
             if(OrderSend(SYMBOL1,OP_SELL,LOT1,BID,Slippage,0,0,"1й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер SELL  лот ",LOT1," ",SYMBOL1);
             else Alert(SYMBOL1," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);
            }
         }
       if(SYMBOL2!="")
         {
          Digit=(int)MarketInfo(SYMBOL2,MODE_DIGITS);
          Poin=MarketInfo(SYMBOL2,MODE_POINT);
          ASK=NormalizeDouble(MarketInfo(SYMBOL2,MODE_ASK),Digit);
          BID=NormalizeDouble(MarketInfo(SYMBOL2,MODE_BID),Digit);
          if(TYPE2==OP_BUY)
            {
             if(OrderSend(SYMBOL2,OP_BUY,LOT2,ASK,Slippage,0,0,"2й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер BUY  лот ",LOT2," ",SYMBOL2);
             else Alert(SYMBOL2," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);
            }
          if(TYPE2==OP_SELL)
            {
             if(OrderSend(SYMBOL2,OP_SELL,LOT2,BID,Slippage,0,0,"2й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер SELL  лот ",LOT2," ",SYMBOL2);
             else Alert(SYMBOL2," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);
            }
         }
       if(SYMBOL3!="")
         {
          Digit=(int)MarketInfo(SYMBOL3,MODE_DIGITS);
          Poin=MarketInfo(SYMBOL3,MODE_POINT);
          ASK=NormalizeDouble(MarketInfo(SYMBOL3,MODE_ASK),Digit);
          BID=NormalizeDouble(MarketInfo(SYMBOL3,MODE_BID),Digit);
          if(TYPE3==OP_BUY)
            {
             if(OrderSend(SYMBOL3,OP_BUY,LOT3,ASK,Slippage,0,0,"3й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер BUY  лот ",LOT3," ",SYMBOL3);
             else Alert(SYMBOL3," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL3,MODE_ASK),"  ",LOT3);
            }
          if(TYPE3==OP_SELL)
            {
             if(OrderSend(SYMBOL3,OP_SELL,LOT3,BID,Slippage,0,0,"3й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер SELL  лот ",LOT3," ",SYMBOL3);
             else Alert(SYMBOL3," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL3,MODE_ASK),"  ",LOT3);
            }
         }
       if(SYMBOL4!="")
         {
          Digit=(int)MarketInfo(SYMBOL4,MODE_DIGITS);
          Poin=MarketInfo(SYMBOL4,MODE_POINT);
          ASK=NormalizeDouble(MarketInfo(SYMBOL4,MODE_ASK),Digit);
          BID=NormalizeDouble(MarketInfo(SYMBOL4,MODE_BID),Digit);
          if(TYPE4==OP_BUY)
            {
             if(OrderSend(SYMBOL4,OP_BUY,LOT4,ASK,Slippage,0,0,"4й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер BUY  лот ",LOT4," ",SYMBOL4);
             else Alert(SYMBOL4," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL4,MODE_ASK),"  ",LOT4);
            }
          if(TYPE4==OP_SELL)
            {
             if(OrderSend(SYMBOL4,OP_SELL,LOT4,BID,Slippage,0,0,"4й_ордер",Magic,0,Blue)!=-1)
                Alert("Ордер SELL  лот ",LOT4," ",SYMBOL4);
             else Alert(SYMBOL4," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL4,MODE_ASK),"  ",LOT4);
            }
         }
       return;
      } 
    
    //=====================================================================
    void close_orders(int para)
    {
    bool err;
    int p1=0, p2=0; //удаляем только два последних ордера
    for(int i=OrdersTotal()-1; i>=0; i--)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic)
        {
         if(p1<=2 && para==1 && (OrderSymbol()==SYMBOL1 || OrderSymbol()==SYMBOL2)) 
          {
           if(OrderType()==OP_BUY)  err=OrderClose(OrderTicket(),OrderLots(), Bid, 30,clrNONE);
           if(OrderType()==OP_SELL) err=OrderClose(OrderTicket(),OrderLots(), Ask, 30,clrNONE);
           p1++;
          }
         if(p2<=2 && para==2 && (OrderSymbol()==SYMBOL3 || OrderSymbol()==SYMBOL4))
          {
           if(OrderType()==OP_BUY)  err=OrderClose(OrderTicket(),OrderLots(), Bid, 30,clrNONE);
           if(OrderType()==OP_SELL) err=OrderClose(OrderTicket(),OrderLots(), Ask, 30,clrNONE);
           p2++;
          }
        }
      }
    return;
    }

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

  2. #2
    Эксперт
    Регистрация
    16.08.2012
    Адрес
    Челябинск
    Сообщений
    1,920
    Благодарности
    Получено: 700
    Отправлено: 73
    Цитата Сообщение от Т926СА Посмотреть сообщение
    которые за следом потом выйдут в профит 2 ордера, они не учитываются для открытия новой 4ки ордеров, а просто закрываются по профиту
    Это условие делает зависимым открытые прочие сделки от первых 4-х. Алгоритм должен различать родительские сделки от дочерних - в коде этого нет.

    Вы не можете благодарить!
    Для заказа кода, напишите в личку - я отвечу на ваше предложение.

  3. #3
    Местный
    Регистрация
    27.09.2018
    Сообщений
    11
    Благодарности
    Получено: 0
    Отправлено: 0
    Цитата Сообщение от wayfarer Посмотреть сообщение
    Это условие делает зависимым открытые прочие сделки от первых 4-х. Алгоритм должен различать родительские сделки от дочерних - в коде этого нет.
    Не скажите какой нужен алгоритм?

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

  4. #4
    Эксперт
    Регистрация
    16.08.2012
    Адрес
    Челябинск
    Сообщений
    1,920
    Благодарности
    Получено: 700
    Отправлено: 73
    Цитата Сообщение от Т926СА Посмотреть сообщение
    какой нужен алгоритм?
    Хм.. я не знаю, потому что в вашем описании требований существует не ясный или даже так - сомнительный момент:
    Цитата Сообщение от Т926СА Посмотреть сообщение
    следом потом выйдут в профит 2 ордера, они не учитываются для открытия новой 4ки ордеров, а просто закрываются по профиту.
    Вот какая картина
    старт - 4 позиции в рынке по 4-ем инструментам.
    событие 1 - некая пара позиций по двум инструментам, тип 1 или 2 согласно коду, закрылись в +, к имеющимся 2 сделкам добавили еще 4-ре.
    далее сидим/стоим/спим/едим/ждем когда 2+4 сделки закроются в +, т.е. по тейк профиту.
    А если не закроются? И сколько вы намерены ждать у моря денег погоды?

    Вы не можете благодарить!
    Для заказа кода, напишите в личку - я отвечу на ваше предложение.

  5. #5
    Местный
    Регистрация
    27.09.2018
    Сообщений
    11
    Благодарности
    Получено: 0
    Отправлено: 0
    Цитата Сообщение от wayfarer Посмотреть сообщение
    Хм.. я не знаю, потому что в вашем описании требований существует не ясный или даже так - сомнительный момент:

    Вот какая картина
    старт - 4 позиции в рынке по 4-ем инструментам.
    событие 1 - некая пара позиций по двум инструментам, тип 1 или 2 согласно коду, закрылись в +, к имеющимся 2 сделкам добавили еще 4-ре.
    далее сидим/стоим/спим/едим/ждем когда 2+4 сделки закроются в +, т.е. по тейк профиту.
    А если не закроются? И сколько вы намерены ждать у моря денег погоды?
    Не нужно чтоб было 2+4= общий профит. просто если из первой 4ки закрылись 2 в +. потом в новой 4ке еще 2 закрываются в плюсе.а которые в убытке висят - пусть висят, когда то же перейдут в +. и так по новой..

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

  6. #6
    Эксперт
    Регистрация
    16.08.2012
    Адрес
    Челябинск
    Сообщений
    1,920
    Благодарности
    Получено: 700
    Отправлено: 73
    Цитата Сообщение от Т926СА Посмотреть сообщение
    Не нужно чтоб было 2+4= общий профит.
    Вы меня окончательно запутали... чтобы вам помочь вам необходимо правильно формализовать алгоритм. Без этого нет ясности. Расписывайте все досконально так чтобы была однозначность чтения ваших требований к алгоритму.

    Вы не можете благодарить!
    Для заказа кода, напишите в личку - я отвечу на ваше предложение.

  7. #7
    Местный
    Регистрация
    27.09.2018
    Сообщений
    11
    Благодарности
    Получено: 0
    Отправлено: 0
    Цитата Сообщение от wayfarer Посмотреть сообщение
    Вы меня окончательно запутали... чтобы вам помочь вам необходимо правильно формализовать алгоритм. Без этого нет ясности. Расписывайте все досконально так чтобы была однозначность чтения ваших требований к алгоритму.
    Устанавливаем советник на график, открываются 4 ордера(1я 4ка). Они разделены на две пары эти 4 ордера(SYMBOL1 + SYMBOL2 или SYMBOL3 + SYMBOL4). Каждая пара закрывается по общему профиту двух ордеров(SYMBOL1 + SYMBOL2 = общий профит или SYMBOL3 + SYMBOL4 = общий профит). Убыточные пары не закрываются. Как только какая либо из пар закрывается по профиту - открывается новая 4ка(2я 4ка). А вторая пара из 1й 4ки которая тоже потом закроется по профиту, либо будет в убытке - по ней уже не открывается новая 4ка ордеров. И так далее.

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

    Запуск советника. Проверка на общий профит всех пар(по 2 ордера) которые остались от предыдущих 4ок.Например сейчас открыта 5я 4ка, в ней пока 4 ордера открыты, а в предыдущих 4ках осталось по 2 ордера. Вот нужно чтобы советник различал эти 4ки и не путал ордера для расчета общего профита двух ордеров из каждой 4ки. Например первый ордер взял из 2й 4ки а второй из 3й 4ки для расчета общего профита - так не пойдет. Так далее проверил, если что и есть закрыл по профиту. Если в последней открытой 4ке открыты все ордера то ждет закрытия какой либо пары( это два ордера) из этой 4ки. Как закроются, открывает новую 4ку. А если в последней 4ке было 2 ордера при запуске, то открывает новую 4ку. и так по кругу.

    Вы не можете благодарить!
    Последний раз редактировалось MrLex; 30.09.2018 в 19:58.

  8. #8
    Эксперт
    Регистрация
    16.08.2012
    Адрес
    Челябинск
    Сообщений
    1,920
    Благодарности
    Получено: 700
    Отправлено: 73
    Этот вариант намного лучше.
    Вердикт:
    Код который у вас есть нужно изменять радикально. Нужен механизм идентификации 4-ок.
    Сова мультвалютная а значит в тестере не прогнать, поэтому тестирование на демо - а это время.
    По совокупности сложности условий и мулти валютности вам нужно нанимать спеца.
    Закажите работу у профи.

    Вы не можете благодарить!
    Для заказа кода, напишите в личку - я отвечу на ваше предложение.

  9. #9
    Местный
    Регистрация
    27.09.2018
    Сообщений
    11
    Благодарности
    Получено: 0
    Отправлено: 0
    Цитата Сообщение от wayfarer Посмотреть сообщение
    Этот вариант намного лучше.
    Вердикт:
    Код который у вас есть нужно изменять радикально. Нужен механизм идентификации 4-ок.
    Сова мультвалютная а значит в тестере не прогнать, поэтому тестирование на демо - а это время.
    По совокупности сложности условий и мулти валютности вам нужно нанимать спеца.
    Закажите работу у профи.
    Ну заказывать это если потом когда буду знать что еще нужно доработать и будет ли возможна прибыль.
    А если опустить идентификацию этих всех четверок. А только чтоб работал с последней 4ой, А определял последние 4 ордера относятся ли к последней 4ке по времени открытия, допустим в 5-10 сек. Если между последней открытой парой ордеров и предпоследней парой ордеров разрыв больше 5-10 сек., то предпоследняя пара относится к предыдущей 4ке и открывается новая 4ка, так как всего два ордера осталось у последней 4ке. А если разрыв по времени меньше, то есть все последние 4 ордера открыты в одно время, то ждет закрытия одной из пар ордеров. То есть вычисляет профит только у последних 4 ордеров открытых в одно время. Если так все упростить для начала?

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

    Запуск советника. Проверка есть ли 4 открытых ордера в одно время. Проверка от последнего открытого ордера. Если есть 4 открытых в одно время, то закрывать их по общему профиту (SYMBOL1 + SYMBOL2 = общий профит или SYMBOL3 + SYMBOL4 = общий профит). Закрывает и открывает новую 4ку. и так по новой. А если после запуска советника, при проверке последних ордеров, открыто всего 2 ордера в одно время то открывается новая 4ку.
    Нужно функцию проверки времени открытия последних 4х ордеров, открыты ли они в одно время или нет, добавить ее в код?

    Вы не можете благодарить!
    Последний раз редактировалось MrLex; 30.09.2018 в 22:08.

  10. #10
    Эксперт
    Регистрация
    16.08.2012
    Адрес
    Челябинск
    Сообщений
    1,920
    Благодарности
    Получено: 700
    Отправлено: 73
    Цитата Сообщение от Т926СА Посмотреть сообщение
    А если опустить идентификацию этих всех четверок. А только чтоб работал с последней 4ой
    Думаю, такой вариант возможен. Нужно внимательно рассмотреть все случаи открытия рыночных ордеров в контексте доступа терминала к серверу ДЦ, остановки и перезапуски советника и определиться с критичным временем дающим точную идентификацию последней 4-ки.

    А теперь главное. Чтобы проверить на жизненность стратегию нужно писать ее под МТ5, иначе поиски ответа затянутся на месяцы.
    Цитата Сообщение от Т926СА Посмотреть сообщение
    Нужно функцию проверки времени открытия последних 4х ордеров, открыты ли они в одно время или нет, добавить ее в код?
    Разработать и добавить в код.

    Вы не можете благодарить!
    Для заказа кода, напишите в личку - я отвечу на ваше предложение.

Ваши права

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