0
Это второй заказ :) 
avatar

AM2

  • 7 января 2016, 16:45
0
Можно выбирать любой символ из таблицы и устанавливать нужный цвет.




extern char symbolCodeBuy=110,         // Код стрелок на покупку
symbolCodeSell=110,                    // Код стрелок на продажу
symbolCodeNoSignal=110;                // Код стрелок нет сигнала

extern color signalBuyColor=Lime,      // Цвет стрелок на покупку
signalSellColor=Red,                   // Цвет стрелок на продажу
noSignalColor=Yellow,                  // Цвет стрелок нет сигнала
textColor=White;                       // Цвет текста

avatar

AM2

  • 6 января 2016, 16:53
0
в покупки полез поправьте пожалуста


Я прошу скрин с настройками в момент когда сделка открыта неправильно.
avatar

AM2

  • 6 января 2016, 15:21
0
Переписал я кимовский индикатор: www.opentraders.ru/downloads/997/

avatar

AM2

  • 6 января 2016, 01:39
0
Оно?
www.opentraders.ru/downloads/998/





//+------------------------------------------------------------------+
//|                                                  Heiken Ashi.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2006-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "We recommend next chart settings (press F8 or select menu 'Charts'->'Properties...'):"
#property description " - on 'Color' Tab select 'Black' for 'Line Graph'"
#property description " - on 'Common' Tab disable 'Chart on Foreground' checkbox and select 'Line Chart' radiobutton"
#property strict

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3

//---
input color ExtColor1 = Red;    // Shadow of bear candlestick
input color ExtColor2 = White;  // Shadow of bull candlestick
input color ExtColor3 = Red;    // Bear candlestick body
input color ExtColor4 = White;  // Bull candlestick body
//--- buffers
double ExtLowHighBuffer[];
double ExtHighLowBuffer[];
double ExtOpenBuffer[];
double ExtCloseBuffer[];

int b=0,s=0;
datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//|------------------------------------------------------------------|
void OnInit(void)
  {
   IndicatorShortName("Heiken Ashi");
   IndicatorDigits(Digits);
//--- indicator lines
   SetIndexStyle(0,DRAW_HISTOGRAM,0,1,ExtColor1);
   SetIndexBuffer(0,ExtLowHighBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM,0,1,ExtColor2);
   SetIndexBuffer(1,ExtHighLowBuffer);
   SetIndexStyle(2,DRAW_HISTOGRAM,0,3,ExtColor3);
   SetIndexBuffer(2,ExtOpenBuffer);
   SetIndexStyle(3,DRAW_HISTOGRAM,0,3,ExtColor4);
   SetIndexBuffer(3,ExtCloseBuffer);
//---
   SetIndexLabel(0,"Low/High");
   SetIndexLabel(1,"High/Low");
   SetIndexLabel(2,"Open");
   SetIndexLabel(3,"Close");
   SetIndexDrawBegin(0,10);
   SetIndexDrawBegin(1,10);
   SetIndexDrawBegin(2,10);
   SetIndexDrawBegin(3,10);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtLowHighBuffer);
   SetIndexBuffer(1,ExtHighLowBuffer);
   SetIndexBuffer(2,ExtOpenBuffer);
   SetIndexBuffer(3,ExtCloseBuffer);
//--- initialization done
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutArrow(string name,double price,int arrow_code,color clr,int width)
  {
//--- создадим стрелку
   ObjectCreate(0,name,OBJ_ARROW,0,Time[1],price);
//--- установим код стрелки
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,arrow_code);
//--- установим цвет стрелки
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим размер стрелки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int UpDn()
  {
   int ud=0;
   for(int i=Bars-1;i>=0;i--)
     {
      if(ExtOpenBuffer[i-1]>ExtCloseBuffer[i-1] && ExtOpenBuffer[i-2]<ExtCloseBuffer[i-2])
        {
         ud=1;//sell
         break;
        }
      if(ExtOpenBuffer[i-1]<ExtCloseBuffer[i-1] && ExtOpenBuffer[i-2]>ExtCloseBuffer[i-2])
        {
         ud=1;//buy
         break;
        }
     }
   return(ud);
  }
//+------------------------------------------------------------------+
//| Heiken Ashi                                                      |
//+------------------------------------------------------------------+
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    i,pos;
   double haOpen,haHigh,haLow,haClose;
//---
   if(rates_total<=10)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtLowHighBuffer,false);
   ArraySetAsSeries(ExtHighLowBuffer,false);
   ArraySetAsSeries(ExtOpenBuffer,false);
   ArraySetAsSeries(ExtCloseBuffer,false);
   ArraySetAsSeries(open,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
   ArraySetAsSeries(close,false);
//--- preliminary calculation
   if(prev_calculated>1)
      pos=prev_calculated-1;
   else
     {
      //--- set first candle
      if(open[0]<close[0])
        {
         ExtLowHighBuffer[0]=low[0];
         ExtHighLowBuffer[0]=high[0];
        }
      else
        {
         ExtLowHighBuffer[0]=high[0];
         ExtHighLowBuffer[0]=low[0];
        }
      ExtOpenBuffer[0]=open[0];
      ExtCloseBuffer[0]=close[0];
      //---
      pos=1;
     }
//--- main loop of calculations
   for(i=pos; i<rates_total; i++)
     {
      haOpen=(ExtOpenBuffer[i-1]+ExtCloseBuffer[i-1])/2;
      haClose=(open[i]+high[i]+low[i]+close[i])/4;
      haHigh=MathMax(high[i],MathMax(haOpen,haClose));
      haLow=MathMin(low[i],MathMin(haOpen,haClose));
      if(haOpen<haClose)
        {
         ExtLowHighBuffer[i]=haLow;
         ExtHighLowBuffer[i]=haHigh;
        }
      else
        {
         ExtLowHighBuffer[i]=haHigh;
         ExtHighLowBuffer[i]=haLow;
        }
      ExtOpenBuffer[i]=haOpen;
      ExtCloseBuffer[i]=haClose;
     }

   if(ExtOpenBuffer[Bars-2]<ExtCloseBuffer[Bars-2] && ExtOpenBuffer[Bars-3]>ExtCloseBuffer[Bars-3]) {b=1;s=0;} //пересечение buy
   if(ExtOpenBuffer[Bars-2]>ExtCloseBuffer[Bars-2] && ExtOpenBuffer[Bars-3]<ExtCloseBuffer[Bars-3]) {b=0;s=1;} //пересечение sell
   
   if(t!=Time[0])
     {
      // BUY
      if(b==1 && ExtLowHighBuffer[Bars-2]==ExtOpenBuffer[Bars-2])
        {
         PutArrow("UP"+(string)Time[0],ExtOpenBuffer[Bars-2],233,Aqua,2);
         Alert(Symbol()+" BUY");
         b=0;
        }
      //SELL
      if(s==1 && ExtLowHighBuffer[Bars-2]==ExtOpenBuffer[Bars-2])
        {
         PutArrow("DN"+(string)Time[0],ExtOpenBuffer[Bars-2],234,Magenta,2);
         Alert(Symbol()+" SELL");
         s=0;
        }
      t=Time[0];
     }

   Comment("\n Open 1: ",ExtOpenBuffer[Bars-1],
           "\n Close 1: ",ExtCloseBuffer[Bars-1],
           "\n Open 2: ",ExtOpenBuffer[Bars-2],
           "\n Close 2: ",ExtCloseBuffer[Bars-2],
           "\n ================",
           "\n Low 1: ",ExtLowHighBuffer[Bars-1],
           "\n High 1: ",ExtHighLowBuffer[Bars-1],
           "\n Low 2: ",ExtLowHighBuffer[Bars-2],
           "\n High 2: ",ExtHighLowBuffer[Bars-2],
           "\n ================",
           "\n UpDn: ",UpDn(),
           "\n BUY: ",b,
           "\n SELL: ",s);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+



avatar

AM2

  • 5 января 2016, 23:08
0
Пока сделал стрелку на смену цвета:






//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutArrow(string name,double price,int arrow_code,color clr,int width)
  {
   ObjectsDeleteAll();
//--- создадим стрелку
   ObjectCreate(0,name,OBJ_ARROW,0,Time[1],price);
//--- установим код стрелки
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,arrow_code);
//--- установим цвет стрелки
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим размер стрелки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
  }
avatar

AM2

  • 5 января 2016, 20:50
0
Индикатор хоть и ставит только гистограмки, но люди делали, тоже пытаюсь <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 

avatar

AM2

  • 5 января 2016, 19:00
0
Давайте ссылку а то с нуля долго.
avatar

AM2

  • 5 января 2016, 15:36
0
если открыться по золоту и посмотреть на другой паре, то значения будут разные.


Одинаковые.



avatar

AM2

  • 5 января 2016, 03:34
0

//+------------------------------------------------------------------+
//|                                                     Informer.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

input int Corner=0; //0-левый верхний. 1-правый верхний. 2-левый нижний. 3-правый нижний.
input int ProfitHour=24; //за сколько часов считаем профит
input color Color=Aqua; //цвет метки
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string text,int corner)
  {
   int x=140,y=40;
   if(corner==0 || corner==2) x=40;
//--- создадим текстовую метку
   ObjectDelete(0,"Info");
   ObjectDelete(0,"Stop");

   if(!ObjectCreate(0,"Info",OBJ_LABEL,0,0,0))
     {
      Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
     }

//--- установим координаты метки
   ObjectSetInteger(0,"Info",OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,"Info",OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,"Info",OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(0,"Info",OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,"Info",OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,"Info",OBJPROP_FONTSIZE,14);
//--- установим цвет
   ObjectSetInteger(0,"Info",OBJPROP_COLOR,Color);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRiskLabel(string text,int corner)
  {
   int x=140,y=60;
   if(corner==0 || corner==2) x=40;
//--- создадим текстовую метку
   ObjectDelete(0,"Stop");

   if(!ObjectCreate(0,"Stop",OBJ_LABEL,0,0,0))
     {
      Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
     }

//--- установим координаты метки
   ObjectSetInteger(0,"Stop",OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,"Stop",OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,"Stop",OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(0,"Stop",OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,"Stop",OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,"Stop",OBJPROP_FONTSIZE,14);
//--- установим цвет
   ObjectSetInteger(0,"Stop",OBJPROP_COLOR,Color);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrencyProfitFromDate(datetime t=0)
  {
   double pr=0;

   for(int i=0; i<OrdersHistoryTotal()-1; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         //if((OrderSymbol()==Symbol()))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime())
                 {
                  pr+=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrencyProfit()
  {
   double pr=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)
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Risk()
  {
   double s=0,p=0,l=0;
   double b=AccountInfoDouble(ACCOUNT_BALANCE);

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderStopLoss()>0)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               s+=MathAbs((OrderOpenPrice()-OrderStopLoss())/Point);
               l+=OrderLots();
              }
           }
        }
     }
   p=100*s*l/b/OrdersTotal();
   return(p);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int r=0;
   double BALANCE=AccountInfoDouble(ACCOUNT_BALANCE);

   if(IsTesting() && OrdersTotal()<1 && Hour()>=9)
     {
      r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
      r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
      r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
     }

   //if(OrdersTotal()<1) r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);

      if(OrdersTotal()<1) PutLabel("Profit: "+DoubleToString(CurrencyProfitFromDate(TimeCurrent()-ProfitHour*60*60)*100/BALANCE,2)+"%",Corner);
   else
     {
      PutLabel("Profit: "+DoubleToString(CurrencyProfit()*100/BALANCE,2)+"%",Corner);
      PutRiskLabel("Risk:   "+DoubleToString(Risk(),2)+"%",Corner);
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 5 января 2016, 01:53
0
Поехали по порядку:

не открыт не 1 ордер — имеем определенное значение за 24 часа


Нет ордеров за сутки. Показывает правильно.



открываем ордер по голде получаем такое

Сделал риск выводим если стоп больше 0.

далее такой пример — не открыто ордеров, имеем убыток -0,43%


Когда не открыты ордера считается за 24 часа.

открываю ордер — профит сразу становится -0,18%


Когда ордер есть профит считается с открытой позы.

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


Осталось посмотреть только этот вопрос когда рынок будет открыт. На остальные ответ выше.
avatar

AM2

  • 5 января 2016, 01:52
0
Написать это одно а отладка занимает времени в разы больше. Буду заниматься отладкой с учетом ваших замечаний.
avatar

AM2

  • 5 января 2016, 00:08
0
Какие настройки у вас стоят в этот момент?
avatar

AM2

  • 5 января 2016, 00:02
0
Я закометарил контроль по символу. Посмотрите:


//+------------------------------------------------------------------+
//|                                                     Informer.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

input int Corner=0; //0-левый верхний. 1-правый верхний. 2-левый нижний. 3-правый нижний.
input int ProfitHour=24; //за сколько часов считаем профит
input color Color=Aqua; //цвет метки
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutLabel(string text,int corner)
  {
   int x=140,y=40;
   if(corner==0 || corner==2) x=40;
//--- создадим текстовую метку
   ObjectDelete(0,"Info");
   ObjectDelete(0,"Stop");

   if(!ObjectCreate(0,"Info",OBJ_LABEL,0,0,0))
     {
      Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
     }

//--- установим координаты метки
   ObjectSetInteger(0,"Info",OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,"Info",OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,"Info",OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(0,"Info",OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,"Info",OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,"Info",OBJPROP_FONTSIZE,14);
//--- установим цвет
   ObjectSetInteger(0,"Info",OBJPROP_COLOR,Color);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRiskLabel(string text,int corner)
  {
   int x=140,y=60;
   if(corner==0 || corner==2) x=40;
//--- создадим текстовую метку
   ObjectDelete(0,"Stop");

   if(!ObjectCreate(0,"Stop",OBJ_LABEL,0,0,0))
     {
      Print(__FUNCTION__,": не удалось создать текстовую метку! Код ошибки = ",GetLastError());
     }

//--- установим координаты метки
   ObjectSetInteger(0,"Stop",OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,"Stop",OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,"Stop",OBJPROP_CORNER,corner);
//--- установим текст
   ObjectSetString(0,"Stop",OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,"Stop",OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,"Stop",OBJPROP_FONTSIZE,14);
//--- установим цвет
   ObjectSetInteger(0,"Stop",OBJPROP_COLOR,Color);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrencyProfitFromDate(datetime t=0)
  {
   double pr=0;

   for(int i=0; i<OrdersHistoryTotal()-1; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         //if((OrderSymbol()==Symbol()))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime())
                 {
                  pr+=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrencyProfit()
  {
   double pr=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)
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Risk()
  {
   double s=0,p=0,l=0;
   double b=AccountInfoDouble(ACCOUNT_BALANCE);
   
   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)
              {
               s+=MathAbs((OrderOpenPrice()-OrderStopLoss())/Point);
               l+=OrderLots();
              }
           }
        }
     }
   p=100*s*l/b/OrdersTotal();  
   return(p);
  }  
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BALANCE=AccountInfoDouble(ACCOUNT_BALANCE);
     
   if(IsTesting() && OrdersTotal()<1 && Hour()>=9)
     {
      int r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
      r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
      r=OrderSend(NULL,0,1,Ask,5,Ask-200*Point,Ask+200*Point,"",0,0,Blue);
     }
   
   if(OrdersTotal()<1) PutLabel("Profit: "+DoubleToString(CurrencyProfitFromDate(TimeCurrent()-ProfitHour*60*60)*100/BALANCE,2)+"%",Corner);
   else 
     {     
      PutLabel("Profit: "+DoubleToString(CurrencyProfit()*100/BALANCE,2)+"%",Corner);
      PutRiskLabel("Risk:   "+DoubleToString(Risk(),2)+"%",Corner);
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 4 января 2016, 22:19
0
Через часок приду, поправлю.
avatar

AM2

  • 4 января 2016, 21:07
0
а он сможет считать с нескольких пар? понимаю это будет уже не индикатор, а советник, но все же было бы хорошо, чтобы считал со всех пар, где открыты ордера.


Обычно программисты работают по заранее утвержденному ТЗ, что не было: а может так, а еще вот так, а теперь давайте вот это попробуем :D 
avatar

AM2

  • 4 января 2016, 19:48
0
Еще раз прошерстил весь код и удалось исправить: www.opentraders.ru/downloads/996/

avatar

AM2

  • 4 января 2016, 19:43
0
Добавил: www.opentraders.ru/downloads/779/


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

#include <stdlib.mqh>

//--- Inputs
extern double StopLoss    = 500; //лось
extern double TakeProfit  = 500; //язь
extern int    Slip        = 100; //проскальзывание
extern int    StartHour   = 9;   //час начала торговли
extern int    EndHour     = 18;  //час окончания торговли
extern int    Reverse     = 1;   //1-реверс. 0-нет.
extern int    Magic       = 123; //магик
extern double Lots        = 0.1; //начальный лот
extern double MaxLot      = 5;   //максимальный лот
extern double KLot        = 2;   //увеличение лота
extern string s = "------------- Настройки ZigZag Larsen -------------";
extern int NoiseLevel     = 30;  // 
extern int SwitchPersent  = 30;  // 
extern int Mode           = 0;   // 
extern int OncePerCandle  = 1;   // 
extern int MaxBars        = 300; // 
extern string ss = "     ------------- Настройки MACD ------------- ";
extern int MACD           = 0;   // 0-выкл. 1-вкл.
extern int Fast           = 12;  // 
extern int Slow           = 26;  // 
extern int Signal         = 9;   // 

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   bool buy,sell;
   double sl=0,tp=0;
   int res=0,err=0;
//--- get ind
   double YellowPoint=iCustom(Symbol(),0,"ZigZag_Larsen_101",NoiseLevel,SwitchPersent,Mode,OncePerCandle,1,1);
   double RedPoint=iCustom(Symbol(),0,"ZigZag_Larsen_101",NoiseLevel,SwitchPersent,Mode,OncePerCandle,2,1);
   double macd=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE,MODE_MAIN,1);

   if(Reverse==0)
     {
      if(MACD==0)
        {
         buy=RedPoint>0;
         sell=YellowPoint>0;
        }

      if(MACD==1)
        {
         buy=RedPoint>0 && macd>0;
         sell=YellowPoint>0 && macd<0;
        }
     }

   if(Reverse==1)
     {
      if(MACD==0)
        {
         sell=RedPoint>0;
         buy=YellowPoint>0;
        }

      if(MACD==1)
        {
         sell=RedPoint>0 && macd>0;
         buy=YellowPoint>0 && macd<0;
        }
     }
//--- sell conditions
   if(sell)
     {
      if(StopLoss>0) sl=NormalizeDouble(Bid+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(Bid-TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_SELL,Lot(),NormalizeDouble(Bid,Digits),Slip,sl,tp,"",Magic,0,Red);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      return;
     }
//--- buy conditions
   if(buy)
     {
      if(StopLoss>0) sl=NormalizeDouble(Ask-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);
      res=OrderSend(Symbol(),OP_BUY,Lot(),NormalizeDouble(Ask,Digits),Slip,sl,tp,"",Magic,0,Blue);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot;
   if(OrdersHistoryTotal()==0)
     {
      lot=Lots;
     }
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()>0)
        {
         lot=Lots;
        }
      if(OrderProfit()<=0)
        {
         lot=OrderLots()*KLot;
        }
     }
   if(lot>MaxLot)lot=Lots;
   return(lot);
  }  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double YellowPoint=iCustom(Symbol(),0,"ZigZag_Larsen_101",NoiseLevel,SwitchPersent,Mode,OncePerCandle,1,1);
   double RedPoint=iCustom(Symbol(),0,"ZigZag_Larsen_101",NoiseLevel,SwitchPersent,Mode,OncePerCandle,2,1);

   if(TimeHour(TimeCurrent())>=StartHour && TimeHour(TimeCurrent())<EndHour)
     {
      if(CountTrades()<1 && t!=Time[0])
        {
         OpenPos();
         t=Time[0];
        }
     }

   Comment("\n YellowPoint ",YellowPoint,
           "\n RedPoint ",RedPoint);
//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 4 января 2016, 18:54
0
Сейчас для теста 3 ордера. Считает: www.opentraders.ru/downloads/995/

avatar

AM2

  • 4 января 2016, 18:29