avva

 
Уровень 11

  Торгую в компаниях:


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

Рейтинг 2146



РЕКОМЕНДУЮ



Скрипт частичных закрытий открытого ордера

Пусть Y — уровень открытого ордера,V — величина лота.Скрипт должен на заданых растояниях d1,d2 и d3 (d1 < d2 < d3) закрывать последовательно части лота V1 ,V2 и V3 (V1 + V2 + V3 = V).Желательно иметь возможность передвигать мышью соответствующие уровни закрытия.
  • 0
  • Просмотров: 6863
  • 14 декабря 2015, 17:40
  • avva
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

Брокер для ваших роботов, 15 лет на рынке

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

+
0
Я делал здесь подобный, oyama просил. Посмотрите в базе.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 14 декабря 2015, 18:12
+
0
В базе скриптов? Я вроде их все просмотрел.
avatar

  11  avva Автор Сообщений: 222

  • 14 декабря 2015, 19:35
+
0
В нашем советнике фактически этот скрипт есть. Это советник на трех индикаторах МА in Color.Единственно нет возможности передвигать уровни ТП.
avatar

  11  avva Автор Сообщений: 222

  • 14 декабря 2015, 20:26
+
0
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 14 декабря 2015, 20:52
+
0
Спасибо Андрей! Кажется это то, что хотелось бы иметь.Жаль, что это советник, а не скрипт, уровни на котором можно мышью менять.Мне намного было бы так удобнее работать.Натянул бы сетку Фибо куда мне удобнее и все, а место для советника бы было свободно.
avatar

  11  avva Автор Сообщений: 222

  • 14 декабря 2015, 22:21
+
0
Жаль, что это советник, а не скрипт, уровни на котором можно мышью менять.

Где вы видели подобный код, дайте мне посмотреть, может быть получится и двигать.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 14 декабря 2015, 23:29
+
0
Доброе утро Андрей! В принципе к активному уровню ТП, выставляемому советником надо добавить лишь уровни ТП1 и ТП2 и сделать их активными(для моих целей ТП3 мне даже не потребуется). И советник должен работать как скрипт.Тогда передвигать ТП, ТП1, ТП2 на нужные уровни я смогу и сам. Или второй вариант: скрипт выставляет сразу три ордера, каждый со своим ТП и СЛ. Конечно его придется сделать и для BUY и для SELL.
Редактирован: 15 декабря 2015, 08:03
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 07:53
+
0
Доброе утро Андрей! В принципе к активному уровню ТП, выставляемому советником надо добавить лишь уровни ТП1 и ТП2 и сделать их активными(для моих целей ТП3 мне даже не потребуется). И советник должен работать как скрипт.Тогда передвигать ТП, ТП1, ТП2 на нужные уровни я смогу и сам. Или второй вариант: скрипт выставляет сразу три ордера, каждый со своим ТП и СЛ. Конечно его придется сделать и для BUY и для SELL.


Мне нужен образец, чтобы в очередной раз не изобретать велосипед.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 13:02
+
0
Уточнити, пожалуйста, образец чего нужен? Скипта? Не могу понять вопрос.Похожий по своей работе скрипт с отложеными ордерами такой:SetOrderbuy.mq4 и SetOrderSell.mq4. Но файлы достаточно велики по объему. Поэтому, одно из двух, либо вот ссылка:http://www.kimiv.ru, либо могу выслать по скайпу.
Редактирован: 15 декабря 2015, 13:48
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 13:24
+
0
Подобный скрипт.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 13:46
+
0
Как все-таки лучше всего их переправить? Пользуюсь именно ими.
Редактирован: 15 декабря 2015, 13:55
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 13:51
+
0
Я написал скрипт, но у меня нет возможности его проверить в тестере, пока поставил на демо.




//+------------------------------------------------------------------+
//|                                                  CloseScript.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
#property show_inputs

extern int TakeProfit1 = 100;
extern int TakeProfit2 = 200;
extern int TakeProfit3 = 300;

extern int Slip=30;

extern double Lot1     = 0.01;
extern double Lot2     = 0.02;
extern double Lot3     = 0.03;

double tp1=0,tp2=0,tp3=0;
bool CloseTP1=true,CloseTP2=true,CloseTP3=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLable(string name,datetime time,double price)
  {
   ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price);
//--- установим цвет метки
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим стиль окаймляющей линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим размер метки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OrdersType()
  {
   int t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)  t=0;
            if(OrderType()==OP_SELL) t=1;
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrders()
  {
   bool cl;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Bid,Slip,Blue);
                  if(cl)CloseTP1=false;
                 }

               if(Bid>tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Bid,Slip,Blue);
                  if(cl)CloseTP2=false;
                 }

               if(Bid>tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Bid,Slip,Blue);
                  if(cl)CloseTP3=false;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(Ask<tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Ask,Slip,Red);
                  if(cl)CloseTP1=false;
                 }

               if(Ask<tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Ask,Slip,Red);
                  if(cl)CloseTP2=false;
                 }

               if(Ask<tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Ask,Slip,Red);
                  if(cl)CloseTP3=false;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   while(!IsStopped())
     {
      if(OrdersType()==0)
        {
         PutLable("TP1",Time[0],Bid+TakeProfit1*Point);
         PutLable("TP2",Time[0],Bid+TakeProfit2*Point);
         PutLable("TP3",Time[0],Bid+TakeProfit3*Point);
        }

      if(OrdersType()==1)
        {
         PutLable("TP1",Time[0],Ask-TakeProfit1*Point);
         PutLable("TP2",Time[0],Ask-TakeProfit2*Point);
         PutLable("TP3",Time[0],Ask-TakeProfit3*Point);
        }
        
      for(int i=ObjectsTotal()-1;i>=0;i--)
        {
         if(ObjectName(i)=="TP1") tp1=ObjectGetDouble(0,"TP1",OBJPROP_PRICE);
         if(ObjectName(i)=="TP2") tp2=ObjectGetDouble(0,"TP2",OBJPROP_PRICE);
         if(ObjectName(i)=="TP3") tp3=ObjectGetDouble(0,"TP3",OBJPROP_PRICE);
        }

      CloseOrders();

      Comment("\n TP1: ",DoubleToString(tp1,Digits),
              "\n TP2: ",DoubleToString(tp2,Digits),
              "\n TP3: ",DoubleToString(tp3,Digits),
              "\n CloseTP1: ",CloseTP1,
              "\n CloseTP2: ",CloseTP2,
              "\n CloseTP3: ",CloseTP3);
     }
  }
//+------------------------------------------------------------------+


Редактирован: 15 декабря 2015, 17:08
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 14:46
+
0
Добрый вечер Андрей! Что-то кроме табличек с указанными уровнями скрипт больше не проявляет какой-либо реакции.Почему-то таблички всегда выстраиваются только на BUY и при пересечении уровней при уже открытом ордере ничего не происходит.
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 17:10
+
0
Уже несколько часов занимаюсь отладкой скрипта. Только что обновил в окошке выше.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 17:12
+
0
То, что вы хотите сделать — это советник.
Скрипт — программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты не обрабатывают никаких событий, кроме события запуска (для этого в скрипте должна быть функция-обработчик OnStart).
Отработала функция OnStart, скрипт выгружается. Он не будет ждать, когда цена дойдет до какой-нибудь отметки, чтобы ордер частично закрылся.
P.S. исключение sleep в цикле
Редактирован: 16 декабря 2015, 00:27
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 15 декабря 2015, 17:47
+
0
Добрый вечер Oxy! Если открыть сразу три ордера каждый со своими SL1,SL2,SL3 и TP1,TP2,TP3, то я думаю, что это все-таки скрипт. Он один раз сработал и все. Если же лот разбивать на три части и наблюдать какая часть и на каком уровне сработает, то, конечно, это будет советник.
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 18:25
+
0
Вы правы, три ордера поставить с разным TP — скрипт.
Только вот может случиться проскальзывание и лоты могут оказаться открытыми по разной цене. Поэтому я практикую частичное закрытие.
Редактирован: 15 декабря 2015, 19:10
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 15 декабря 2015, 19:05
+
0
Отработала функция OnStart, скрипт выгружается. Он не будет ждать, когда цена дойдет до какой-нибудь отметки, чтобы ордер частично закрылся.


Я со скриптами мало дело имел, но вот скрипт для трейлинга от цмиллиона:


//+------------------------------------------------------------------+
//|                                       cm Script TrailingStop.mq4 |
//|                                Copyright 2015, cmillion@narod.ru |
//|                                               http://cmillion.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, cmillion@narod.ru"
#property link      "http://cmillion.ru"
#property version   "1.00"
#property strict
#property show_inputs
//--------------------------------------------------------------------
input int     StopLoss=0;     //стоплосс
input int     TakeProflt=0;    //желаемая прибыль
input int     TrailingStop = 10;     //как прибыль ордера достигает этого значения в пунктах, Stop Loss переносится на на цену открытия ордера и далее тралится по профиту. 
input int     StepTrall    = 10;     //Шаг Трала.
//--------------------------------------------------------------------
void OnStart()
  {
   while(!IsStopped())
     {
      double OSL,OTP,OOP,StLo,SL,TP;
      int tip;
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==Symbol())
              {
               tip = OrderType();
               OSL = NormalizeDouble(OrderStopLoss(),Digits);
               OTP = NormalizeDouble(OrderTakeProfit(),Digits);
               OOP = NormalizeDouble(OrderOpenPrice(),Digits);
               SL=OSL;TP=OTP;
               if(tip==OP_BUY)
                 {
                  //ставим стоп если нет
                  if(OSL==0 && StopLoss!=0)
                    {
                     SL=NormalizeDouble(OOP-StopLoss*Point,Digits);
                    }
                  //ставим тейк если нет  
                  if(OTP==0 && TakeProflt!=0)
                    {
                     TP=NormalizeDouble(OOP+TakeProflt*Point,Digits);
                    }
                  //если трал не равен 0 
                  if(TrailingStop!=0)
                    {
                     //стоп равен бид минус трал
                     StLo=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     //если стоп StLo больше цены открытия
                     if(StLo>=OOP && StLo>=OSL+StepTrall*Point) SL=StLo;
                    }
                  if(SL!=OSL || TP!=OTP)
                    {
                     if(!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
                    }
                 }
               if(tip==OP_SELL)
                 {
                  if(OSL==0 && StopLoss!=0)
                    {
                     SL=NormalizeDouble(OOP+StopLoss*Point,Digits);
                    }
                  if(OTP==0 && TakeProflt!=0)
                    {
                     TP=NormalizeDouble(OOP-TakeProflt*Point,Digits);
                    }
                  if(TrailingStop!=0)
                    {
                     StLo=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(StLo<=OOP && (StLo<=OSL-StepTrall*Point || OSL==0)) SL=StLo;
                    }
                  if(SL!=OSL || TP!=OTP)
                    {
                     if(!OrderModify(OrderTicket(),OOP,SL,TP,0,White)) Print("Error OrderModify ",GetLastError());
                    }
                 }
              }
           }
        }
      RefreshRates();
      Sleep(500);
     }
   return;
  }
//+------------------------------------------------------------------+



Функция в арбитражнике невеста тоже сделана в виде скрипта, вот я и смотрю эту тему.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 18:07
+
0
Если сделать так, чтобы скрипт открывал сразу три ордера каждый со своими SL1,SL2,SL3 и TP1,TP2,TP3, то я думаю, что этого будет более чем достаточно. Скрипт для трейлинга не удобен для работы на сетке Фибо. Скрипты SetOrderbuy.mq4 и SetOrderSell.mq4 всем хороши. Грубо говоря, если бы заставить один скрипт делать их в " троем экземпляре" и не для отложенных ордеров, а для исполняемых сразу! Работа приведенных скриптов много кратно проверялась и очень удобна в работе.
Редактирован: 15 декабря 2015, 19:02
avatar

  11  avva Автор Сообщений: 222

  • 15 декабря 2015, 18:56
+
0
Для проверки своих мыслей написал скрипт с выставлением ордеров. Повторно ордера не выставились.


//+------------------------------------------------------------------+
//|                                                    PutOrders.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
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   while(!IsStopped())
     {
      if(CountTrades()<10)int r=OrderSend(NULL,1,0.01,NormalizeDouble(Bid,Digits),55,0,NormalizeDouble(Bid-20*Point,Digits),"",0,0,Red);
      //int r=OrderSend(NULL,0,0.01,NormalizeDouble(Ask,Digits),55,0,Ask-1*Point,"",0,0,Blue);
      Sleep(100);
      Comment("\n Count Trades: ",CountTrades());
     }     
  }
//+------------------------------------------------------------------+



Значит все переделываю в советник.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 19:02
+
0
Я со скриптами мало дело имел, но вот скрипт для трейлинга от цмиллиона:

Не выгружается благодаря Sleep(500); Не проверяла, работает ли это в новых билдах.
Только смысл, если в советнике на каждом тике проверять точнее?
Редактирован: 15 декабря 2015, 19:09
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 15 декабря 2015, 19:07
+
0
Добавил в конце RefreshRates() ордера выставились повторно, похоже что можно тики обрабатывать как в советнике.


//+------------------------------------------------------------------+
//|                                                    PutOrders.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
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   while(!IsStopped())
     {
      if(CountTrades()<10)int r=OrderSend(NULL,1,0.01,NormalizeDouble(Bid,Digits),55,0,NormalizeDouble(Bid-20*Point,Digits),"",0,0,Red);
      //int r=OrderSend(NULL,0,0.01,NormalizeDouble(Ask,Digits),55,0,Ask-1*Point,"",0,0,Blue);
      RefreshRates();
      Sleep(100);
      Comment("\n Count Trades: ",CountTrades());
     }     
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 19:52
+
0
*yes*  Если точнее, текущие цены, проверяются чуть менее, чем десять раз в секунду

Прошу прощения за занудство… *stesnitelno* 
Редактирован: 15 декабря 2015, 22:10
avatar

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

  • 15 декабря 2015, 22:10
+
0
Привет! При чем здесь задержка Sleep?
В скрипте запускается бесконечный цикл while(!IsStopped())
Так что в любом билде работать будет.
avatar

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

  • 15 декабря 2015, 22:05
+
0
Так Sleep и ставится или в while или в for. Иначе смысл его? Иначе просто бесконечный while может всё подвесить.
Fargo, мне подкорректировать предыдущее сообщение, что благодаря Sleep в цикле while? ))))))))))
Редактирован: 16 декабря 2015, 00:20
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 16 декабря 2015, 00:17
+
0
При чем здесь задержка Sleep?


Слип я ставил чтобы посмотреть как в скрипте задержка работает. Также как в советнике оказалось.
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 15 декабря 2015, 22:15
+
0
Это я для Oxy написал. Промазал что ли *think* 

А Sleep в данном случае нещь просто необходимая, ее нельзя выбрасывать
avatar

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

  • 15 декабря 2015, 22:41
+
0
Но все-равно не понимаю, почему вы делаете скрипт, а не советник.
Во-первых, советник точнее работал бы с ценой.
Во-вторых цикл while не даст завершить работу скрипта, и он также будет работать даже когда все ордера закроются. Или тогда условие while менять — пока ордер не закрылся полностью, скрипт будет работать, иначе — завершаем.
Если выключить и включить терминал, скрипт не запустится, а советник запустится. А если комп случайно выключился? Свет моргнул. Включили терминал заново — советник подхватит работающий ордер, а скрипт заново руками запускать.
Если у заказчика много советников, и все должны работать. То просто открыть несколько графиков с одним символом и на каждом графике повесить по советнику.
P.S. разрыв с сервером или интернетом вызовет ошибку, в этом случае IsStopped() true или false?
Редактирован: 16 декабря 2015, 00:33
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 16 декабря 2015, 00:25
+
0
Насколько я понимаю — false — т.к. команды на прекращение работы не было. Терминал ждет восстановления коннекта. Цикл будет крутится если не будет фатальной ошибки в теле самого цикла. Как то так…

ПС: Возможно заказчик имел в виду именно советник. Т.к. возможно, для него (как и для многих не специалистов) нет разницы между скриптом и советником. Этот вопрос остался не выясненным.
Редактирован: 16 декабря 2015, 00:49
avatar

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

  • 16 декабря 2015, 00:42
+
0
Скрипт тестируется на демо а советник в тестере работает.

Скрипт:


//+------------------------------------------------------------------+
//|                                                  CloseScript.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
#property show_inputs

extern int TakeProfit1 = 100;
extern int TakeProfit2 = 200;
extern int TakeProfit3 = 300;

extern int Slip=30;

extern double Lot1     = 0.01;
extern double Lot2     = 0.02;
extern double Lot3     = 0.03;

double tp1=0,tp2=0,tp3=0;
bool CloseTP1=true,CloseTP2=true,CloseTP3=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLable(string name,datetime time,double price)
  {
   ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price);
//--- установим цвет метки
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим стиль окаймляющей линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим размер метки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OrdersType()
  {
   int t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)  t=1;
            if(OrderType()==OP_SELL) t=2;
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrders()
  {
   bool cl;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Bid,Slip,Blue);
                  if(cl)CloseTP1=false;
                 }

               if(Bid>tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Bid,Slip,Blue);
                  if(cl)CloseTP2=false;
                 }

               if(Bid>tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Bid,Slip,Blue);
                  if(cl)CloseTP3=false;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(Ask<tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Ask,Slip,Red);
                  if(cl)CloseTP1=false;
                 }

               if(Ask<tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Ask,Slip,Red);
                  if(cl)CloseTP2=false;
                 }

               if(Ask<tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Ask,Slip,Red);
                  if(cl)CloseTP3=false;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   while(!IsStopped())
     {
      if(OrdersType()==1)
        {
         PutLable("TP1",Time[0],Bid+TakeProfit1*Point);
         PutLable("TP2",Time[0],Bid+TakeProfit2*Point);
         PutLable("TP3",Time[0],Bid+TakeProfit3*Point);
        }

      if(OrdersType()==2)
        {
         PutLable("TP1",Time[0],Ask-TakeProfit1*Point);
         PutLable("TP2",Time[0],Ask-TakeProfit2*Point);
         PutLable("TP3",Time[0],Ask-TakeProfit3*Point);
        }

      for(int i=ObjectsTotal()-1;i>=0;i--)
        {
         if(ObjectName(i)=="TP1") tp1=ObjectGetDouble(0,"TP1",OBJPROP_PRICE);
         if(ObjectName(i)=="TP2") tp2=ObjectGetDouble(0,"TP2",OBJPROP_PRICE);
         if(ObjectName(i)=="TP3") tp3=ObjectGetDouble(0,"TP3",OBJPROP_PRICE);
        }

      CloseOrders();

      Comment("\n TP1: ",DoubleToString(tp1,Digits),
              "\n TP2: ",DoubleToString(tp2,Digits),
              "\n TP3: ",DoubleToString(tp3,Digits),
              "\n CloseTP1: ",CloseTP1,
              "\n CloseTP2: ",CloseTP2,
              "\n CloseTP3: ",CloseTP3,
              "\n Orders Type: ",OrdersType());

      RefreshRates();
     }
  }
//+------------------------------------------------------------------+



avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 12:39
+
0
Советник:




//+------------------------------------------------------------------+
//|                                                     CloseExp.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 TakeProfit1 = 100;
extern int TakeProfit2 = 200;
extern int TakeProfit3 = 300;

extern int Slip=30;

extern double Lot1     = 0.01;
extern double Lot2     = 0.02;
extern double Lot3     = 0.03;

double tp1=0,tp2=0,tp3=0;
bool CloseTP1=true,CloseTP2=true,CloseTP3=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLable(string name,datetime time,double price)
  {
   ObjectCreate(0,name,OBJ_ARROW_LEFT_PRICE,0,time,price);
//--- установим цвет метки
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим стиль окаймляющей линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим размер метки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
//--- включим (true) или отключим (false) режим перемещения метки мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,true);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OrdersType()
  {
   int t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)  t=1;
            if(OrderType()==OP_SELL) t=2;
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseOrders()
  {
   bool cl;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Bid,Slip,Blue);
                  if(cl)CloseTP1=false;
                 }

               if(Bid>tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Bid,Slip,Blue);
                  if(cl)CloseTP2=false;
                 }

               if(Bid>tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Bid,Slip,Blue);
                  if(cl)CloseTP3=false;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(Ask<tp1)
                 {
                  if(CloseTP1) cl=OrderClose(OrderTicket(),Lot1,Ask,Slip,Red);
                  if(cl)CloseTP1=false;
                 }

               if(Ask<tp2)
                 {
                  if(CloseTP2) cl=OrderClose(OrderTicket(),Lot2,Ask,Slip,Red);
                  if(cl)CloseTP2=false;
                 }

               if(Ask<tp3)
                 {
                  if(CloseTP3) cl=OrderClose(OrderTicket(),Lot3,Ask,Slip,Red);
                  if(cl)CloseTP3=false;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(IsTesting())
     {
      if(OrdersTotal()<1) int r=OrderSend(NULL,1,1,Bid,5,0,0,"",0,0,Green);
      //int r=OrderSend(NULL,0,1,Ask,5,0,0,"",0,0,Green);
     }
     
   if(OrdersType()==1)
     {
      PutLable("TP1",Time[0],Bid+TakeProfit1*Point);
      PutLable("TP2",Time[0],Bid+TakeProfit2*Point);
      PutLable("TP3",Time[0],Bid+TakeProfit3*Point);
     }

   if(OrdersType()==2)
     {
      PutLable("TP1",Time[0],Ask-TakeProfit1*Point);
      PutLable("TP2",Time[0],Ask-TakeProfit2*Point);
      PutLable("TP3",Time[0],Ask-TakeProfit3*Point);
     }

   for(int i=ObjectsTotal()-1;i>=0;i--)
     {
      if(ObjectName(i)=="TP1") tp1=ObjectGetDouble(0,"TP1",OBJPROP_PRICE);
      if(ObjectName(i)=="TP2") tp2=ObjectGetDouble(0,"TP2",OBJPROP_PRICE);
      if(ObjectName(i)=="TP3") tp3=ObjectGetDouble(0,"TP3",OBJPROP_PRICE);
     }

   CloseOrders();

   Comment("\n TP1: ",DoubleToString(tp1,Digits),
           "\n TP2: ",DoubleToString(tp2,Digits),
           "\n TP3: ",DoubleToString(tp3,Digits),
           "\n CloseTP1: ",CloseTP1,
           "\n CloseTP2: ",CloseTP2,
           "\n CloseTP3: ",CloseTP3,
           "\n Orders Type: ",OrdersType());

   RefreshRates();
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 12:40
+
0
Что-то при компиляции советник показывает 4 ошибки
avatar

  11  avva Автор Сообщений: 222

  • 16 декабря 2015, 13:29
+
0
Что-то при компиляции советник показывает 4 ошибки


Нет ошибок.

avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 13:41
+
0
Скрипт тоже работает. Я не дождался когда он закроет в положительной зоне, тогда перевел метки в отрицательную и закрыл как положено.

avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 13:47
+
0
Скинул в базу советник: www.opentraders.ru/downloads/976/
скрипт: www.opentraders.ru/downloads/977/
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 13:38
+
0
Андрей! Моя огромная благодарность!!! Устанавливаю.
avatar

  11  avva Автор Сообщений: 222

  • 16 декабря 2015, 13:46
+
0
Я тоже видел как скрипт закрыл последовательно все части! А как задавать на скрипте ту часть, которую следует закрыть?
Редактирован: 16 декабря 2015, 14:16
avatar

  11  avva Автор Сообщений: 222

  • 16 декабря 2015, 14:14
+
0
Мне было бы достаточно того, чтобы задавалась 1/3 от объема лота.
avatar

  11  avva Автор Сообщений: 222

  • 16 декабря 2015, 14:30
+
0
А как задавать на скрипте ту часть, которую следует закрыть?


В настройках Lot1 лот ближайшей к цене метки и т.д.


extern double Lot1 = 0.01;
extern double Lot2 = 0.02;
extern double Lot3 = 0.03;
avatar

  35  AM2 Сообщений: 16276 - Андрей

  • 16 декабря 2015, 14:55
+
0
Андрей! Я не нарадуюсь, глядя на работу скрипта! Более того, сколько бы ни было открыто ордеров нужная чать закрывается! Спасибо.
avatar

  11  avva Автор Сообщений: 222

  • 16 декабря 2015, 16:59
+
0
Очень добротная вещь получилась, оставляю в своем наборе.спасибо. *zapoy* 
avatar

  11  Deimos Сообщений: 94

  • 17 декабря 2015, 13:06
+
0
Спасибо за отзыв!
avatar

  11  avva Автор Сообщений: 222

  • 17 декабря 2015, 21:19

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