0
3 даже:

SMA CrossOver_Justin
ADXcrossesNon-repainting
@@ADXcrossesNon-repainting
avatar

AM2

  • 29 августа 2016, 15:21
0
Т.к. еще 2 индикатора отсутствуют сделал как есть:





//+------------------------------------------------------------------+
//| 4Min_Binary_Strategy.mq4 |
//| JDP |
//| |
//+------------------------------------------------------------------+
#property copyright «JDP»
#property link ""
#property version «1.00»
#property strict
#property indicator_chart_window
#define NL "\n"

extern bool DoAlert=true;
int CurrentState=0;
double Price;
datetime LastTm;
int Total,TotalSuccess;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutArrow(string name,datetime time,double price,int code,color clr)
{
ObjectCreate(0,name,OBJ_ARROW,0,time,price);

//--- установим код стрелки
ObjectSetInteger(0,name,OBJPROP_ARROWCODE,code);
//--- установим способ привязки
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- установим цвет стрелки
ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(0,name,OBJPROP_STYLE,0);
//--- установим размер стрелки
ObjectSetInteger(0,name,OBJPROP_WIDTH,2);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//if (Time[0]+180>=TimeCurrent()) {
if(iCustom(Symbol(),0,«SMA CrossOver_Justin»,1,1)!=EMPTY_VALUE)
{
if(iCustom(Symbol(),0,«ADXcrossesNon-repainting»,3,0,0)!=EMPTY_VALUE)
{
if(iCustom(Symbol(),0,"@@ADXcrossesNon-repainting",5,0,0)!=EMPTY_VALUE)
{
if(CurrentState==0)
{
CurrentState=1;
Price=Close[0];
if(DoAlert)
{
if(LastTm<Time[0])
{
Alert(«CALL: »,Symbol(),": ",DoubleToStr(Close[0],Digits),": EXPIRY: ",TimeToStr(Time[0]+300));
PutArrow(«CALL»+(string)time[0],time[0],high[0],234,Red);
}
}
LastTm=Time[0];
}
}
}
}
if(iCustom(Symbol(),0,«SMA CrossOver_Justin»,0,1)!=EMPTY_VALUE)
{
if(iCustom(Symbol(),0,«ADXcrossesNon-repainting»,3,1,0)!=EMPTY_VALUE)
{
if(iCustom(Symbol(),0,"@@ADXcrossesNon-repainting",5,1,0)!=EMPTY_VALUE)
{
if(CurrentState==0)
{
CurrentState=-1;
Price=Close[0];
if(DoAlert)
{
if(LastTm<Time[0])
{
Alert(«PUT: »,Symbol(),": ",DoubleToStr(Close[0],Digits),": EXPIRY: ",TimeToStr(Time[0]+300));
PutArrow(«PUT»+(string)time[0],time[0],low[0],233,Blue);
}
}
LastTm=Time[0];
}
}
}
}
//} 
if(CurrentState==1)
{
if(LastTm==Time[1])
{

if(Close[1]>Price)
{
Print(«CALL SUCCESS: »,DoubleToStr(Price,Digits)," TO ",DoubleToStr(Close[1],Digits));
TotalSuccess=TotalSuccess+1;
} else {
Print(«CALL FAILURE: »,DoubleToStr(Price,Digits)," TO ",DoubleToStr(Close[1],Digits));
}
Total=Total+1;
CurrentState=0;
}
}
if(CurrentState==-1)
{
if(LastTm==Time[1])
{
if(Close[1]<Price)
{
Print(«PUT SUCCESS: »,DoubleToStr(Price,Digits)," TO ",DoubleToStr(Close[1],Digits));
TotalSuccess=TotalSuccess+1;
} else {
Print(«PUT FAILURE: »,DoubleToStr(Price,Digits)," TO ",DoubleToStr(Close[1],Digits));
}
Total=Total+1;
CurrentState=0;
}
}
DoDisplay();
return(rates_total);
}
//+------------------------------------------------------------------+
void DoDisplay()
{
string s;
double tmp;
s = NL + «5 Minute Binary Strategy» + NL;
s = s + "===============" + NL + NL;
if(DoAlert)
{
s=s+«ALERT: ON»+NL;
} else {
s=s+«ALERT: OFF»+NL;
}
if(CurrentState==0)
{
s=s+«STATE: WAITING»+NL+NL;
}
if(CurrentState==1)
{
s=s+«STATE: CALL»+NL+NL;
}
if(CurrentState==-1)
{
s=s+«STATE: PUT»+NL+NL;
}
s = s + «TOTAL TRADES: » + IntegerToString(Total) + NL;
s = s + «TOTAL WINS: » + IntegerToString(TotalSuccess) + NL;
if(Total>0)
{
tmp = TotalSuccess;
tmp = tmp/Total;
s=s+«SUCCESS PERCENTAGE: „+DoubleToStr(tmp*100,2)+NL;
}
Comment(s);
}
//+------------------------------------------------------------------+
avatar

AM2

  • 29 августа 2016, 15:02
0
Посмотрю сегодня
avatar

AM2

  • 29 августа 2016, 13:18
0
Сделал с нуля стопы по значкам. ТЗ взял из топика по ссылке:




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

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 30;       // пункты БУ
extern int TrailingStop  = 0;        // трал
extern int Expiration    = 14;       // истечениe ордера в часах
extern int Slip          = 30;       // реквот
extern int Shift         = 1;        // на каком баре сигнал индикатора
extern int Delta         = 50;       // расстояние от цены
extern int Magic         = 123;      // магик

extern string IndName    = "DSerg";
extern int    Nlin       = 25;        // Мин. длина канала линейной регрессии
extern int    r0         = 150;       // Макс. высота канала в пунктах
extern double t0         = 2.618;     // Цель при пробое отн. ширины канала
extern bool   useClose   = true;      // Использовать для расчёта Close,\n если false - High/Low
extern int    Nbars      = 5000;      // Количество баров для расчёта

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   double strelka=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,7,Shift);
   double kresrik=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,2,Shift);

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);      else sl=NormalizeDouble(kresrik,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);  else tp=NormalizeDouble(strelka,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);      else sl=NormalizeDouble(kresrik,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);  else tp=NormalizeDouble(strelka,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   Print("Price: ",price," SL: ",sl," TP: ",tp);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders()
  {
   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()>=0) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenOrd()
  {
   double up=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,5,Shift);
   double dn=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,6,Shift);

   if(up>0)
     {
      PutOrder(4,Ask+Delta*Point);
     }

   if(dn>0)
     {
      PutOrder(5,Bid-Delta*Point);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   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)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*Point)
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if((OrderOpenPrice()-Ask)>TrailingStop*Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*Point)) || (OrderStopLoss()==0))
                    {
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Yellow);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   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)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*Point) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*Point) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double up=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,5,Shift);
   double dn=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,6,Shift);
   double strelka=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,7,Shift);
   double kresrik=iCustom(NULL,0,IndName,"",Nlin,"",r0,"",t0,"",useClose,"",Nbars,2,Shift);

   if(CountOrders()<1 && t!=Time[0])
     {
      OpenOrd();
      t=Time[0];
     }

   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();

   Comment("\n up: ",up,
           "\n dn: ",dn,
           "\n strelka: ",strelka,
           "\n kresrik: ",kresrik);
  }
//+------------------------------------------------------------------+



Прошу сделать советник на основе индикатора Dserg-LinRegressionBreakout_v1.1, открытие ордера при сигнале «стрелка», возможность
выставлять в настройках:

— количество пунктов через которые выставляется ордер;
— СЛ;
— ТП;
— трал ордера;
avatar

AM2

  • 29 августа 2016, 09:08
0
На скрине показано с какими параметрами оптимизировал. Проведите самостоятельно оптимизацию и прогоните затем в тестере.
avatar

AM2

  • 28 августа 2016, 17:29
0
насчет другого топика вообще не понял))


Если какой то другой формат строки в текстовом файле, то индикатор нужно переписывать.
avatar

AM2

  • 27 августа 2016, 13:03
0
кручу верчу, не получается — в данных по умолчанию огромный синий квадрат, а когда вбиваю свои, то просто не чего нет. Не могли бы вы на примере моих данных создать текстовый файл, чтобы был пример.


Другие данные другой топик.
avatar

AM2

  • 27 августа 2016, 12:35
+1
Авансом только когда есть свободное время, сейчас работы хватает.
avatar

AM2

  • 27 августа 2016, 12:30
0
Все теперь весь файл читает. Текстовый файл д.б. в папке Files терминала. Бросаем индикатор на график, в настройках указываем имя файла и вуаля :) 
www.opentraders.ru/downloads/1300/



У меня текстовый файл такого вида:

2016.08.08 2016.08.22 1.1220 1.1350 1.1300 1.1050 1.1110
2016.07.08 2016.07.22 1.1220 1.1350 1.1300 1.1050 1.1110
avatar

AM2

  • 27 августа 2016, 08:07
0
Набросал пока для одной строки:

2016.08.08 2016.08.22 1.1220 1.1350 1.1300 1.1050 1.1110
2016.07.08 2016.07.22 1.1220 1.1350 1.1300 1.1050 1.1110





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

input string FileName="EURUSD.txt";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRect(string name,datetime t1,double p1,datetime t2,double p2,color clr)
  {
//--- создадим прямоугольник по заданным координатам
   ObjectCreate(0,name,OBJ_RECTANGLE,0,t1,p1,t2,p2);
//--- установим цвет прямоугольника
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
//--- откроем файл
   int h=FileOpen(FileName,FILE_READ|FILE_TXT);
//--- прочитаем данные из файла
   while(!FileIsEnding(h))
     {
      //--- узнаем сколько символов использовано для записи времени
      int size=FileReadInteger(h,INT_VALUE);
      //--- прочитаем строку
      string s=FileReadString(h,size);

      PutRect("UP",StringToTime(StringSubstr(s,0,10)),StringToDouble(StringSubstr(s,32,6)),StringToTime(StringSubstr(s,12,10)),StringToDouble(StringSubstr(s,40,6)),Blue);
      PutRect("DN",StringToTime(StringSubstr(s,0,10)),StringToDouble(StringSubstr(s,48,6)),StringToTime(StringSubstr(s,12,10)),StringToDouble(StringSubstr(s,56,6)),Red);
      PutRect("MID",StringToTime(StringSubstr(s,0,10)),StringToDouble(StringSubstr(s,24,6)),StringToTime(StringSubstr(s,12,10)),StringToDouble(StringSubstr(s,24,6))+30*Point,Aqua);
      //--- распечатаем строку
      Print(s);
     }
//--- закроем файл
   FileClose(h);

   //PutRect("R",time[1],1.12,time[11],1.13,Blue);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 27 августа 2016, 00:52
0
Можно будет сделать в виде индикатора, при удалении все объекты исчезнут :) 
После выходных посмотрю.
avatar

AM2

  • 26 августа 2016, 22:30
0
Пока что не представляю как это сделать, может позже что то умное придет :) 
avatar

AM2

  • 26 августа 2016, 17:31
0
Чтобы учитывал квантум нужно писать дополнительную функцию, это после выходных.
avatar

AM2

  • 26 августа 2016, 17:19