0
Уже несколько часов занимаюсь отладкой скрипта. Только что обновил в окошке выше.
avatar

AM2

  • 15 декабря 2015, 17:12
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);
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

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


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

AM2

  • 15 декабря 2015, 13:02
0
Подправить СЛ лакирующего ордера, если стоит " 0 " то ордер закрывается вместе со всем коленом.
Не важно он ( в + или в -).


Опишите все как можно подробнее. Это описание понятно вам, но непонятно мне.
avatar

AM2

  • 15 декабря 2015, 12:59
0
У Кима есть такая функция. Наберите в поиске только полезные функции Kim IV.
avatar

AM2

  • 15 декабря 2015, 12:30
0
Сделайте лучше новый заказ и опишите все подробно как должно быть.
avatar

AM2

  • 15 декабря 2015, 00:20
0
Есть индикаторы, которые считают фрактал с 2 и более баров слева справа, но к вашему это не относится.
avatar

AM2

  • 15 декабря 2015, 00:15
0
Попробуйте заменить этот блок:


//----------------------------------
   if(buySignal && countOrdersBuy>1 && TradeBuy)
     {
      OpenOrderCorrect(OP_SELL,GetLot(countOrdersSell,OP_SELL)/2,NP(Bid),ND(Slippage*K),ND(0.0),ND(0.0),Red);
     }

   if(sellSignal && countOrdersSell>1 && TradeSell)
     {
      OpenOrderCorrect(OP_BUY,GetLot(countOrdersBuy,OP_BUY)/2,NP(Ask),ND(Slippage*K),ND(0.0),ND(0.0),Blue);
     }
//----------------------------------


на этот:


//----------------------------------
   if(buySignal && countOrdersBuy>1 && TradeBuy)
     {
      OpenOrderCorrect(OP_SELL,GetLot(countOrdersSell,OP_SELL),NP(Bid),ND(Slippage*K),ND(0.0),ND(0.0),Red);
     }

   if(sellSignal && countOrdersSell>1 && TradeSell)
     {
      OpenOrderCorrect(OP_BUY,GetLot(countOrdersBuy,OP_BUY),NP(Ask),ND(Slippage*K),ND(0.0),ND(0.0),Blue);
     }
//----------------------------------
avatar

AM2

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

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

AM2

  • 14 декабря 2015, 23:29
0
что не так с этим советником. то вместо продажи покупает, и наоборот. то вдруг начинает открывать ордера со скоростью пулемёта и тут же их закрывать с минусом 0.03-0.05. удалил. душа не выдержала, глядя на это безобразие. 50$ таким образом как ветром сдуло. хорошо хоть только с демо.

Здесь больше человек хочет проверить идею. Если не работает и заказчик предоставляет скрины и логи, тогда ставлю на отладку.
avatar

AM2

  • 14 декабря 2015, 23:27
+1
Сделал немного по другому:




//+------------------------------------------------------------------+
//|                                                    Activator.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

//--- Inputs
extern double Loss        = 50;   //лось
extern double Profit      = 10;   //язь
extern int    Slip        = 100;  //проскальзывание
extern int    Magic       = 123;  //магик
extern double Lots        = 0.1;  //лот
extern double KLot        = 2;    //уменьшение лота
extern double MaxLot      = 10;   //максимальный лот
//----Настройки Gann_HiLo_Activator_v2
extern int LookBack=12;  // 

int btrade=0, strade=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(CountTrades()>0) lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   bool del;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,Slip,White);
            if(OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Ask,Slip,White);
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    res=0;
//--- get ind
   double ind=iCustom(Symbol(),0,"Gann_HiLo_Activator_v2",LookBack,0,1);

//--- sell conditions
   if(Close[1]<ind && strade<1)
     {
      res=OrderSend(NULL,1,Lot(),fND(Bid),Slip,0,0,"",Magic,0,Red);
      btrade=0;
      strade=1;
     }

//--- buy conditions
   if(Close[1]>ind && btrade<1)
     {
      res=OrderSend(NULL,0,Lot(),fND(Ask),Slip,0,0,"",Magic,0,Blue);
      btrade=1;
      strade=0;
     }
//---
  }
//+------------------------------------------------------------------+
double fND(double d,int n=-1)
  {
   if(n<0) return(NormalizeDouble(d, Digits));
   return(NormalizeDouble(d, n));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- get ind
   double ind=iCustom(Symbol(),0,"Gann_HiLo_Activator_v2",LookBack,0,1);
   double BALANCE=AccountInfoDouble(ACCOUNT_BALANCE);
   double EQUITY=AccountInfoDouble(ACCOUNT_EQUITY);
   double Prosadka=0;

      OpenPos();

   if(Loss>0)
     {
      Prosadka=100*(BALANCE-EQUITY)/BALANCE;
        {
         if(Prosadka>=Loss)
           {
            CloseAll();
            Print("Closed All due to Stop Out");
           }
        }
     }

   if(Profit>0)
     {
      Prosadka=100*(EQUITY-BALANCE)/BALANCE;
        {
         if(Prosadka>=Profit)
           {
            CloseAll();
            Print("Closed All due to All Profit");
           }
        }
     }

   Comment("\n Ind",ind,
           "\n Buy Trade",btrade,
           "\n Sell Trade",strade);
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 14 декабря 2015, 21:10
0
У меня пишет тоже и работает :)  Еще завтра посмотрю.
avatar

AM2

  • 14 декабря 2015, 20:46
0
Терминал МТ5 и демка от метаквотов:

avatar

AM2

  • 14 декабря 2015, 18:17
0
Я делал здесь подобный, oyama просил. Посмотрите в базе.
avatar

AM2

  • 14 декабря 2015, 18:12
0
avatar

AM2

  • 14 декабря 2015, 18:09