Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Есть возможность протестировать программу перед покупкой. Узнай как!
_MorPHeuS_
63
_MorPHeuS_ 2013.01.14 13:08 

Как сделать так, что при выполнение одного условия открывались два типа отложеных ордеов(BuyLimit и SellLimit, по 4 штуки с заданым шагом) в разные стороны? 

  // ----------------------------Торговые критерии-------------------------
   if ((Hour_curr>=TimeStart) && (Hour_curr<=TimeStart) &&
   (Close[1]-Open[0]>=-3*Point && Close[1]-Open[0]<=3*Point))                    // Основной критерий
     {                                                                           // Критерий выполнен
      Opn_B=true;                                                                // Критерий откр. Buy
      Opn_S=true;                                                                // Критерий откр. Sell
     }
  // -----------------------------Учёт ордеров-------------------------------
  Total=0;                                                                       // Количество ордеров
  for(int i=1; i<=OrdersTotal(); i++)                                            // Цикл перебора ордер
    {
     if (OrderSelect(i-1,SELECT_BY_POS)==true)                                   // Если есть следующий
       {                                                                         // Анализ ордеров:
        if (OrderSymbol()!=Symb)continue;                                        // Не наш фин. инструм
        if (OrderType()>1)                                                       // Попался отложенный
          {
           Alert("Обнаружен отложенный ордер. Эксперт не работает.");
           return;                                                               // Выход из start()
          }
        Total++;                                                                 // Счётчик рыночн. орд
        if (Total>1)                                                             // Не более одного орд
          {
           Alert("Несколько рыночных ордеров. Эксперт не работает.");
           return;                                                               // Выход из start()
          }
        Ticket=OrderTicket();                                                    // Номер выбранн. орд.
        Tip   =OrderType();                                                      // Тип выбранного орд.
        Price =OrderOpenPrice();                                                 // Цена выбранн. орд.
        SL    =OrderStopLoss();                                                  // SL выбранного орд.
        TP    =OrderTakeProfit();                                                // TP выбранного орд.
        Lot   =OrderLots();                                                      // Количество лотов
       }
    }

Помогите привести этот фрагмент в порядок, используются только Limit ордера.

 

  // -----------------------------Открытие ордеров---------------------------
  while(true)                                                                    // Цикл закрытия орд.
    {
     if (Total==0 && Opn_B==true)                                                // Открытых орд. нет +
       {                                                                         // критерий откр. Buy
        RefreshRates();                                                          // Обновление данных
        OP=Open[0] - Dist*Point;                                                 // Цена по какой ордер 1 будет открыт
        SL=OP - StopLoss*Point;                                                  // Вычисление SL откр.
        TP=OP + TakeProfit*Point;                                                // Вычисление TP откр.
        Exp = TimeCurrent() + 60*60*TimePlus;
        Alert("Попытка открыть Buy. Ожидание ответа..");
        Ticket=OrderSend(Symb,OP_BUYLIMIT,Lts,OP,2,SL,TP,"BuyLimit 1",1,Exp,Red);//Открытие BuyLimit
        if (Ticket > 0)                                                          // Получилось :)
          {
           Alert ("Открыт ордер Buy ",Ticket);
           return;                                                               // Выход из start()
          }                                                                      // Выход из start()
       }
     if (Total==0 && Opn_S==true)                                                // Открытых орд. нет +
       {                                                                         // критерий откр. Sell
        RefreshRates();                                                          // Обновление данных
        OP=Open[0] + Dist*Point;                                                 // Цена по какой ордер 1 будет открыт
        SL=OP + StopLoss*Point;                                                  // Вычисление SL откр.
        TP=OP - TakeProfit*Point;                                                // Вычисление TP откр.
        Exp = TimeCurrent() + 60*60*TimePlus;
        Alert("Попытка открыть Sell. Ожидание ответа..");
        Ticket=OrderSend(Symb,OP_SELLLIMIT,Lts,OP,2,SL,TP,"SellLimit 1",1,Exp,Blue);//Открытие SellLimit
        if (Ticket > 0)                                                          // Получилось :)
          {
           Alert ("Открыт ордер Sell ",Ticket);
           return;                                                               // Выход из start()
          }
       }
     break;                                                                      // Выход из while
    }

Этот код почему то не работает:(

 

Я не эксперт в отрасли програмирования, так что пожалуйста не судите строго:)

Зарание благодарю:) 

Vladimir Pastushak
59382
Vladimir Pastushak 2013.01.14 13:29  

1-Для начала нужно получить 4 цены для каждого из типов ордеров.

2-Если все 4 цены получены

3-Проверяем есть ли наши ордера, ордера нашего советника

4-Выставляем по существующим ценам ордера 

В Вашем случае

  Total=0;    
  int bl=0,sl=0;                                                                   // Количество ордеров
  for(int i=1; i<=OrdersTotal(); i++)                                            // Цикл перебора ордер
    {
     if (OrderSelect(i-1,SELECT_BY_POS)==true)                                   // Если есть следующий
       {                                                                         // Анализ ордеров:
        if (OrderSymbol()!=Symb)continue;                                        // Не наш фин. инструм
        if (OrderType()>1&&OrderMagicNumber()==Magic)                                                       // Попался отложенный
          {        Total++; 
           if (OrderType()==OP_BUYLIMIT )  bl++;        
           if (OrderType()==OP_SELLLIMIT)  sl++;                                   
          }                                     
       }
    }

if (bl==0)//открыть первый байлимит

if (bl==1)//если уже есть один бай лимит открыть еще

if (sl==0)

if (sl==1)
_MorPHeuS_
63
_MorPHeuS_ 2013.01.14 15:48  
VOLDEMAR:

1-Для начала нужно получить 4 цены для каждого из типов ордеров.

2-Если все 4 цены получены

3-Проверяем есть ли наши ордера, ордера нашего советника

4-Выставляем по существующим ценам ордера 

В Вашем случае

 

Подскажи пожалуйста, что с этим делать, я это копировал в учет ордеров, перед этим удалив то что было, но ордера теперь вообще не открываются:(

Я так понял, это:

  Total=0;    
  int bl=0,sl=0;                                                                   // Количество ордеров
  for(int i=1; i<=OrdersTotal(); i++)                                            // Цикл перебора ордер
    {
     if (OrderSelect(i-1,SELECT_BY_POS)==true)                                   // Если есть следующий
       {                                                                         // Анализ ордеров:
        if (OrderSymbol()!=Symb)continue;                                        // Не наш фин. инструм
        if (OrderType()>1&&OrderMagicNumber()==Magic)                                                       // Попался отложенный
          {        Total++; 
           if (OrderType()==OP_BUYLIMIT )  bl++;        
           if (OrderType()==OP_SELLLIMIT)  sl++;                                   
          }                                     
       }
    }

Вставить в функцию учата ордеров!

 

А вот это:

if (bl==0)//открыть первый байлимит

if (bl==1)//если уже есть один бай лимит открыть еще

if (sl==0)

if (sl==1)
Это куда? В функцию открытия ордеров?
Mikhail Kozhemyako
1181
Mikhail Kozhemyako 2013.01.14 16:30  

Попробуйте так... Код непроверял, но вроде все ОК

      exp=0;// Время истечения отложенных ордеров
      Longsl=Delta;Longtp=Delta;// Напишите свои вычисления стоплоссов/тейкпрофитов или 0 если их не используете-при этом закоментируйте строку ниже
      Longsl=NormalizeDouble(Bid-Longsl-StartDelta,Digits);Longtp=NormalizeDouble(Bid+Longtp-StartDelta,Digits);// StartDelta - отступ до открытия отложенников
      pr=Delta;price=Ask-StartDelta;
      LongLots=StartLots;
      for(i=1;i<=N;i++)// N - Кол-во отложенников сколько хотим открыть
       {
        OpenPosition(Symbol(),OP_BUYLIMIT,LongLots,price,Longsl,Longtp,MAGIC,exp);// функция открытия ордеров от KimIV
        price=NormalizeDouble(price-pr,Digits);
        pr=pr*Kdelta;// Если каждый последующий хотим открыть на расстоянии меньше/больше чем предыдущий. Kdelta=1 открываем на одном и том=же расстоянии.
        LongLots=NormalizeDouble(LongLots*Klot,2);if(LongLots<0.01)LongLots=0.01;// Тоже самое с лотами
       }
  
      Shortsl=Delta;Shorttp=Delta;// Напишите свои вычисления стоплоссов/тейкпрофитов или 0 если их не используете-при этом закоментируйте строку ниже
      Shortsl=NormalizeDouble(Bid+Shortsl+StartDelta,Digits);Shorttp=NormalizeDouble(Bid-Shorttp+StartDelta,Digits);// StartDelta - отступ до открытия отложенников
      pr=Delta;price=Bid+StartDelta;
      ShortLots=StartLots;
      for(i=1;i<=N;i++)// N - Кол-во отложенников сколько хотим открыть
       {
        OpenPosition(Symbol(),OP_SELLLIMIT,ShortLots,price,Shortsl,Shorttp,MAGIC,exp);// функция открытия ордеров от KimIV
        price=NormalizeDouble(price+pr,Digits);
        pr=pr*Kdelta;// Если каждый последующий хотим открыть на расстоянии меньше/больше чем предыдущий. Kdelta=1 открываем на одном и том=же расстоянии.
        ShortLots=NormalizeDouble(ShortLots*Klot,2);if(ShortLots<0.01)ShortLots=0.01;// Тоже самое с лотами
       }
_MorPHeuS_
63
_MorPHeuS_ 2013.01.14 16:43  

Решил задачу, по другому, но решил, сейчас открывается нужное количество ордеров, и нужные типы:)

Sepulca - я позже, как доделаю выложу код, не знаю насколько верно я сделал, думаю будет с чего посмеятся для профи:) 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий