Группа "Стол заказов MQL"

Рейтинг 2089



РЕКОМЕНДУЮ




Лучшее от big13



Помогите со скриптом Комментариев 21
2015-12-17 00:22:32Рейтинг 0

Помогите со скриптом

Доброе время суток, нужен скрипт, который бы выставлял лось на все ордера по заданному меджик номеру(изначально ордера идут без стоп лоса)на определенном количестве пунктов от последнего ордера, т.е. если есть 10 бай ордеров стоп устанавливается от самого нижнего ордера на заданном количестве пунктов, селл от верхнего.
  • +1
  • Просмотров: 1780
  • 17 декабря 2015, 00:22
  • big13
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
подправить индикатор
16 декабря 2015
17 декабря 2015

Комментарии (21)

+
0
Сейчас посмотрю что можно сделать.
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 12:31
+
0
Написал, занимаюсь отладкой, сыпет ошибку модификации, модифицирует один ордер затем ошибка.



Функция которая выдает ошибку:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeStop()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {            
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastBuyPrice()-Delta*Point,Digits),OrderTakeProfit(),0,Yellow);
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastSellPrice()+Delta*Point,Digits),OrderTakeProfit(),0,Yellow);
              }
           }
        }
     }
   return;
  }


Код полностью:


//+------------------------------------------------------------------+
//|                                                     PutStops.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern int    StopLoss    = 900; //Стоплосс ордера
extern int    Delta       = 200; //Расстояние от крайнего ордера

double price=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeStop()
  {
   bool m;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {            
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastBuyPrice()-Delta*Point,Digits),OrderTakeProfit(),0,Yellow);
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastSellPrice()+Delta*Point,Digits),OrderTakeProfit(),0,Yellow);
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            int r=OrderSend(Symbol(),OP_BUYLIMIT,0.1,Ask-i*100*Point,0,0,0,"",0,0,Blue);
           }
        }
     }

   if(CountTrades()>=10) ModeStop();

   Comment("\n Last Buy Price: ",FindLastBuyPrice(),
           "\n Count Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 15:55
+
0
Эээ… *spokuha* 

if(oticket>ticketNumber)

Андрей, а почему сравниваешь тикеты ордеров, а не цены открытия?
если есть 10 бай ордеров стоп устанавливается от самого нижнего ордера на заданном количестве пунктов, селл от верхнего.


Самый последний, может и не быть самым нижним/верхним… *pardon* 
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 16:14
+
0
У меня сначала не работала эта функция, взял готовое, особо пока не заморачиваюсь над этим.
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 16:18
+
0
Где то в этом выражении ошибка:

FindLastBuyPrice()-Delta*Point


Так работает:

m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-StopLoss*Point,Digits),OrderTakeProfit(),0,Yellow);
              }
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 16:31
+
0
У тебя компилятор пропускает такое
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)


У меня всегда ругается если условия не возьму в скобочки

if((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY))
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 17:07
+
0
У тебя компилятор пропускает такое

Пропускает, можно разделить условия.
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 17:16
+
0
Взято с форума mql4.com
Читаем HELP!!!
Что значит ошибка с номером 1 при модификации ордера? Читаем:
ERR_NO_RESULT — OrderModify пытается изменить уже
установленные значения такими же значениями. Необходимо изменить одно или
несколько значений и повторить попытку.

Т.е. при «трале» Вы пытаетесь менять уровень стопа сам на себя. Откуда такое может быть? Из операций предварительного сравнения цен перед проведением модификации ордера!
Вы сравниваете ненормализованные цены и получаете результат — цены неравны. Пытаетесь произвести модификацию (при ней цены нормализуются принудительно) и получаете ответ что новая цена уже и так равна старой — менять нечего.
Отсюда вывод — всегда нормализуйте цены в операциях сравнения!!!


Может здесь собака порылась? :) 
Редактирован: 17 декабря 2015, 17:53
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 17:29
+
0
Он модифицировал один ордер и продолжает его долбить, хотя в условии:
if(OrderStopLoss()==0)


avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 17:55
+
0
Слушай а выборка ордеров не сбивается случаем?
Смотри, в 1-м цикле OrderSelect — позиционирует на очередном ордере и вызывается фунция в которой запускается свой цикл с селектами, возвращается значение и потом идет обращение за номером ордера.
А селект то после функции стоит на последнем ордере, одном и том же. Да и с точки производительности вызывать внутренний цикл для получения одного и того же значения не комильфо…
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 18:14
+
0
Читаем:
ERR_NO_RESULT — OrderModify пытается изменить уже
установленные значения такими же значениями. Необходимо изменить одно или
несколько значений и повторить попытку.


Перед модификацией стоит условие:
if(OrderStopLoss()==0)

Зачем же он опять лезет его модифицировать?
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 18:10
+
0
Это я уже вкурил. Просто не видел явной проверки на соответствие стопа нужному значению
А проверку на нулевость упустил *pardon* 
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 18:16
+
0
Попробовал еще такую конструкцию, тоже самое:


   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)
           {
            if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastBuyPrice()-StopLoss*Point,Digits),OrderTakeProfit(),0,Yellow);
            string oop="oop: "+DoubleToString(OrderOpenPrice())+"  ";
            string sl="sl: "+DoubleToString(NormalizeDouble(FindLastBuyPrice()-StopLoss*Point,Digits))+"  ";
            string tp="tp: "+DoubleToString(OrderTakeProfit());
            Print(StringConcatenate(oop,sl,tp));
           }

         if(OrderType()==OP_SELL)
           {
            if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastSellPrice()+StopLoss*Point,Digits),OrderTakeProfit(),0,Yellow);
           }
        }
     }
   return;
  }
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 18:20
+
+1
Попробуй вот так
if(OrderType()==OP_BUY)
              {
               Print(StringConcatenate("1  ",OrderTicket()));
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(FindLastBuyPrice()-StopLoss*Point,Digits),OrderTakeProfit(),0,Yellow);
               Print(StringConcatenate("2  ",OrderTicket()));
              }


Что напишет?
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 18:30
+
0
Буду переписывать FindLastBuyPrice().
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 18:32
+
0
Да не надо ее переписывать. Там все нормально по моему
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 18:33
+
+1
Да не надо ее переписывать. Там все нормально по моему

Просто сделай так
void ModeStop()
  {
   bool m;
   double StopBuy=NormalizeDouble(FindLastBuyPrice()-StopLoss*Point,Digits);
   double StopSell=NormalizeDouble(FindLastSellPrice()+Delta*Point,Digits);
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {            
            if(OrderType()==OP_BUY)
              {
               
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),StopBuy,OrderTakeProfit(),0,Yellow);
               
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),StopSell,OrderTakeProfit(),0,Yellow);
              }
           }
        }
     }
   return;
  }
avatar

  13  Fargo Сообщений: 495

  • 17 декабря 2015, 18:37
+
0
Поиск сузился до выражения FindLastBuyPrice(). Если вместо вставить значение 1.08223 все работает.
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 18:30
+
0
Да не надо ее переписывать. Там все нормально по моему

О благодарствую, заработало! Все перепробовали! :) 


//+------------------------------------------------------------------+
//|                                                     PutStops.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern int    StopLoss=300; //Стоплосс ордера

double price=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeStop()
  {
   bool m;
   double StopBuy=NormalizeDouble(FindLastBuyPrice()-StopLoss*Point,Digits);
   double StopSell=NormalizeDouble(FindLastSellPrice()+StopLoss*Point,Digits);
   
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),StopBuy,OrderTakeProfit(),0,Yellow);
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()==0) m=OrderModify(OrderTicket(),OrderOpenPrice(),StopSell,OrderTakeProfit(),0,Yellow);
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   int oticket,ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            oticket=OrderTicket();
            if(oticket>ticketNumber)
              {
               ticketNumber=oticket;
               oprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oprice);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(IsTesting())
     {
      if(OrdersTotal()<1)
        {
         for(int i=1;i<=10;i++)
           {
            int r=OrderSend(Symbol(),OP_BUYLIMIT,0.1,Ask-i*100*Point,0,0,0,"",0,0,Blue);
           }
        }
     }

   if(CountTrades()>=10) ModeStop();

   Comment("\n Last Buy Price: ",FindLastBuyPrice(),
           "\n Count Trades: ",CountTrades());
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 17 декабря 2015, 18:58
+
0
доброго времени суток, видать я вам задачку непростую подкинул, сам неделю воевал с этим скриптом, только ночами сидел, а потом на работу, к концу недели начались глюки и появилось желание разбить комп, пришлось бросить и искать помощи на стороне.
avatar

  3  big13 Автор Сообщений: 14

  • 18 декабря 2015, 09:31
+
0
Получается уже 3 головы участвовало, змей горыныч однако! :D 
avatar

  34  AM2 Сообщений: 15885 - Андрей

  • 18 декабря 2015, 13:27

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари