ОБНОВЛЕНИЕ !!! Поэтому я пишу обновление вверху, чтобы запомнить это на потом.
Я выяснил, почему SellProfit показывает неправильную прибыль. Оказывается, функция суммирования запускает первый Selltrigger и dosent отображает его, но все равно сохраняет это значение до конца. Это означает, что он дает ложные результаты.
Как вы можете видеть на картинке, у нас есть только один buySquare и нет SellSquare, но есть комментарий SellProfit (до слева) по-прежнему показывает цену продажи. Таким образом, он считает первый триггер на продажу и последнее закрытие на продажу как одну сделку, но не отображает ее.
Я не знаю, как исправить это в коде, который у меня есть сейчас, но думаю, что смогу исправить это если я нахожусь, посмотрите на текстовый элемент и попытайтесь собрать их и таким образом суммировать. Это похоже на неправильный путь к go, но все, что я могу придумать до сих пор.
Итак.
Я работаю над индикатором, который отображает входные сигналы покупки / продажи и closeorder для тех. Я также работаю над отображением прибыли этого ордера.
это выглядит так.
double SquareStartPrice = 0;
double SquareEndPrice = 0;
double OrderStartPrice = 0;
double BuyProfit = 0;
double SellProfit = 0;
double profit = 0;
и
if(BuySignal && !BuyOrder_Bool)
{
SquareStartPrice = Close[i];
SquareEndPrice = Close[i];
}
if(BuySignalOut && !BuySignalOut_Bool)
{
SquareEndPrice = Close[i];
BuyProfit += (SquareEndPrice-SquareStartPrice);
//profit = (profit+BuyProfit);
}
if(SellSignal && !SellOrder_Bool)
{
SquareStartPrice = Close[i];
SquareEndPrice = Close[i];
}
if(SellSignalOut && ! SellSignalOut_Bool)
{
SellProfit += (SquareStartPrice-SquareEndPrice);
profit = (profit+SellProfit);
}
Проблема у меня при суммировании индекс SellProfit. Это неправильно, но BuyProfit работает (я думаю).
это выглядит примерно так.
Зеленый квадрат - это BuySignal, а число слева - прибыль. Red Sqyare - это сигнал продажи, а число слева - это прибыль.
BuyProfit = (15,3) + (-4,38) = 10,92 SellProfit = (-1,07)
Если мы посмотрим на комментарий, который находится под символом, мы видим, что BuyProfit является правильным, но не SellProfit.
С чего начать определение проблемы?
И вот весь код: (не знаю, Могу прикрепить файл .mq4)
//+------------------------------------------------------------------+
//| Test.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 3
//--- plot EmaTrend
#property indicator_label1 "EmaTrend"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrBlack
#property indicator_style1 STYLE_SOLID
#property indicator_width1 4
//--- plot EmaShort
#property indicator_label2 "EmaShort"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrRed
#property indicator_style2 STYLE_SOLID
#property indicator_width2 4
//--- plot Trend
#property indicator_label3 "Trend"
#property indicator_type3 DRAW_LINE
#property indicator_color3 clrGreen
#property indicator_style3 STYLE_SOLID
#property indicator_width3 4
//--- input parameters
//input int LookBack= 5000;
input datetime LookBackTo = D'2020.06.01 00:00:00';
extern double Static_LotSize=0.01;
extern string ____Moving_Average____ = " //////////////////// ";
input int myEmaTrend_Value = 350;
input int myEmaShort_Value = 9;
extern string ____MACD____ = " //////////////////// ";
//input bool myMACD_Bool = true;
input int myMACD_FAST_EMA =12;
input int myMACD_SLOW_EMA =26;
input int myMACD_SIGNAL_SMA =9;
extern string ____RSI____ = " //////////////////// ";
input int myRSI_Period =14;
input int myRSI_High =70;
input int myRSI_Low =30;
extern string ____DeMarker____ = " //////////////////// ";
input int myDeMarker_Period =14;
input double myDeMarker_High =0.70;
input double myDeMarker_Low =0.30;
extern string ____BuySellSignalOut____= " //////////////////// ";
input bool myEma_Bool = true;
input bool myRSI_Bool = false;
input bool myDeMarker_Bool = false;
bool BuyOrder_Bool = false;
bool SellOrder_Bool = false;
bool BuySignalOut_Bool = false;
bool SellSignalOut_Bool = false;
double SquareStartPrice = 0;
double SquareEndPrice = 0;
double OrderStartPrice = 0;
double BuyProfit = 0;
double SellProfit = 0;
double profit = 0;
int objcount=0;
int BuySquareCount=0;
int SellSquareCount=0;
color SquareTextColor=clrBlack;
color InfoTextColor=clrBlack;
int ButtonXSize = 140;
double pipsmultiplier;
//--- indicator buffers
double EmaTrendBuffer[];
double EmaShortBuffer[];
double TrendBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,EmaTrendBuffer);
SetIndexBuffer(1,EmaShortBuffer);
SetIndexBuffer(2,TrendBuffer);
deleteObjects();
if(MarketInfo(Symbol(),MODE_DIGITS)==3 && MarketInfo(Symbol(),MODE_DIGITS)==5)
{
pipsmultiplier=10;
}
else
{
pipsmultiplier=1;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
//--- initial zero
int limit = rates_total - prev_calculated;
ArraySetAsSeries(EmaTrendBuffer, true);
ArraySetAsSeries(EmaShortBuffer, true);
ArraySetAsSeries(TrendBuffer, true);
SetLabelObject("TestPos1","TestPos1",10,40,InfoTextColor);
int shift=iBarShift(Symbol(),PERIOD_CURRENT,LookBackTo);
Comment("BuyProfit = "+calculatePip(BuyProfit)+ "\n" + "SellProfit = "+calculatePip(SellProfit)+ "\n" +"SHIFT = "+shift);
if(prev_calculated < 1)
{
ArrayInitialize(EmaTrendBuffer, 0);
ArrayInitialize(EmaShortBuffer, 0);
ArrayInitialize(TrendBuffer, 0);
}
else
limit++;
//--- main loop
for(int i = limit-1; i >= 0; i--)
{
if(i >= MathMin(shift-1, rates_total-1-50))
continue; //omit some old rates to prevent "Array out of range" or slow calculation
//Indicator Buffer 1
double myEmaTrend = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i);
EmaTrendBuffer[i] = myEmaTrend;
double myEmaTrend_Prev = iMA(Symbol(),PERIOD_CURRENT,myEmaTrend_Value,0,MODE_EMA,PRICE_CLOSE,i+1);
double myEmaShort = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i);
EmaShortBuffer[i] = myEmaShort;
double myEmaShort_Prev = iMA(Symbol(),PERIOD_CURRENT,myEmaShort_Value,0,MODE_EMA,PRICE_CLOSE,i+1);
double myMACD_Signal = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i);
double myMACD_Signal_Prev = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_SIGNAL,i+1);
double myMACD = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i);
double myMACD_Prev = iMACD(Symbol(),PERIOD_CURRENT,myMACD_FAST_EMA,myMACD_SLOW_EMA,myMACD_SIGNAL_SMA,PRICE_CLOSE,MODE_MAIN,i+1);
double myRSI = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i);
double myRSI_Prev = iRSI(Symbol(),PERIOD_CURRENT,myRSI_Period,PRICE_CLOSE,i+1);
double myDeMarker =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i);
double myDeMarker_Prev =iDeMarker(Symbol(),PERIOD_CURRENT,myDeMarker_Period,i+1);
bool BuyTrend = myEmaShort>myEmaTrend;
bool BuyTrend_Prev = myEmaShort_Prev>myEmaTrend_Prev;
//----------
bool BuySignal = BuyTrend && BuyTrend_Prev && myMACD_Prev<myMACD_Signal_Prev && myMACD>myMACD_Signal && myMACD_Prev<0 && myMACD<0;
bool BuySignalOut = (myEma_Bool && BuyTrend_Prev && !BuyTrend) ||
(myRSI_Bool && myRSI>myRSI_High && myRSI_Prev<myRSI_High) ||
(myDeMarker_Bool && myDeMarker>myDeMarker_High && myDeMarker_Prev<myDeMarker_High);
//----------
bool SellSignal = !BuyTrend && !BuyTrend_Prev && myMACD_Prev>myMACD_Signal_Prev && myMACD<myMACD_Signal && myMACD_Prev>0 && myMACD>0;
bool SellSignalOut = (myEma_Bool && !BuyTrend_Prev && BuyTrend) ||
(myRSI_Bool && myRSI<myRSI_Low && myRSI_Prev>myRSI_Low) ||
(myDeMarker_Bool && myDeMarker<myDeMarker_Low && myDeMarker_Prev>myDeMarker_Low);
//----------
ObjectSetString(NULL,"TestPos1",OBJPROP_TEXT,"Profit = "+string(calculatePip(profit)));
//----------
if(BuySignal && !BuyOrder_Bool)
{
SquareStartPrice = Close[i];
SquareEndPrice = Close[i];
SetVlineObject("BuySignal"+string(objcount), Time[i], clrGreen);
SetSquareObject("BuySquare"+string(BuySquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrGreen);
objcount++;
BuySquareCount++;
BuyOrder_Bool = true;
SellOrder_Bool = false;
BuySignalOut_Bool = false;
}
if(BuySignalOut && !BuySignalOut_Bool)
{
SetVlineObject("BuySignalOut"+string(objcount), Time[i], clrDarkGreen);
ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_TIME2,Time[i]);
SquareEndPrice = Close[i];
ObjectSet("BuySquare"+string(BuySquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
ObjectSetString(NULL,"BuySquare"+string(BuySquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareEndPrice-SquareStartPrice)));
BuyProfit += (SquareEndPrice-SquareStartPrice);
//profit = (profit+BuyProfit);
objcount++;
BuyOrder_Bool = false;
BuySignalOut_Bool=true;
//----------
}
if(SellSignal && !SellOrder_Bool)
{
SquareStartPrice = Close[i];
SquareEndPrice = Close[i];
SetVlineObject("SellSignal"+string(objcount), Time[i], clrRed);
SetSquareObject("SellSquare"+string(SellSquareCount), Time[i], SquareStartPrice,Time[i], SquareEndPrice,clrRed);
objcount++;
SellSquareCount++;
BuyOrder_Bool = false;
SellOrder_Bool = true;
SellSignalOut_Bool = false;
}
if(SellSignalOut && ! SellSignalOut_Bool)
{
SetVlineObject("SellSignalOut"+string(objcount), Time[i], clrDarkRed);
ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_TIME2,Time[i]);
SquareEndPrice = Close[i];
ObjectSet("SellSquare"+string(SellSquareCount-1),OBJPROP_PRICE2,SquareEndPrice);
ObjectSetString(NULL,"SellSquare"+string(SellSquareCount-1)+"text",OBJPROP_TEXT,string(calculatePip(SquareStartPrice-SquareEndPrice)));
SellProfit += (SquareStartPrice-SquareEndPrice);
profit = (profit+SellProfit);
objcount++;
SellOrder_Bool = false;
SellSignalOut_Bool = true;
}
}
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetVlineObject |
//+------------------------------------------------------------------+
void SetVlineObject(string name, datetime t, color colour)
{
if(ObjectFind(name) == -1)
{
ObjectCreate(name,OBJ_VLINE,0,t,0);
ObjectSet(name, OBJPROP_COLOR, colour);
ObjectSet(name, OBJPROP_BACK, false);
ObjectSet(name, OBJPROP_WIDTH, 4);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetSquareObject |
//+------------------------------------------------------------------+
void SetSquareObject(string name, datetime t1, double P1,datetime t2, double P2,color colour)
{
if(ObjectFind(name) == -1)
{
ObjectCreate(name,OBJ_RECTANGLE,0,t1,P1,t2,P2);
ObjectSet(name, OBJPROP_CORNER, 1); // Reference corner
ObjectSet(name,OBJPROP_BGCOLOR,colour);
ObjectSet(name,OBJPROP_COLOR,colour);
ObjectCreate(name+"text",OBJ_TEXT,0,t1,P1);
ObjectSet(name+"text",OBJPROP_COLOR,SquareTextColor);
ObjectSet(name+"text",OBJPROP_FONTSIZE,25);
ObjectSet(name+"text", OBJPROP_ANCHOR,4);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetLabelObject |
//+------------------------------------------------------------------+
void SetLabelObject(string name, string text, double P1, double P2,color colour)
{
if(ObjectFind(name) == -1)
{
ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSetString(NULL,name,OBJPROP_TEXT,text);
ObjectSet(name, OBJPROP_CORNER, 1); // Reference corner
ObjectSet(name, OBJPROP_XDISTANCE, P1);// X coordinate
ObjectSet(name, OBJPROP_YDISTANCE, P2);// Y coordinate
ObjectSet(name,OBJPROP_BGCOLOR,colour);
ObjectSet(name,OBJPROP_COLOR,colour);
ObjectSet(name,OBJPROP_FONTSIZE,25);
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| SetButtonObject |
//+------------------------------------------------------------------+
void SetButtonObject(string name,string text, double P1, double P2,color colour)
{
if(ObjectFind(name) == -1)
{
ObjectCreate(name,OBJ_BUTTON,0,0,0,0);
ObjectSet(name, OBJPROP_CORNER, 1);
ObjectSet(name,OBJPROP_XDISTANCE,P1);
ObjectSet(name,OBJPROP_YDISTANCE,P2);
ObjectSet(name,OBJPROP_XSIZE,ButtonXSize);
ObjectSet(name,OBJPROP_YSIZE,40);
ObjectSetString(NULL,name,OBJPROP_TEXT,text);
ObjectSet(name,OBJPROP_COLOR,clrWhite);
ObjectSet(name,OBJPROP_BGCOLOR,colour);
}
}
//+------------------------------------------------------------------+
double calculatePip(double number)
{
double a = Point;
number = NormalizeDouble( (number/a) * (pipsmultiplier),Digits);
number = number * Static_LotSize;
return(number);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
deleteObjects();
//----
return(0);
}
//+------------------------------------------------------------------+
//| Delete CreateObjects |
//+------------------------------------------------------------------+
int deleteObjects()
{
ObjectsDeleteAll(NULL, OBJ_VLINE); // delete all horizontal lines from the 2nd subwindow
ObjectsDeleteAll(NULL, OBJ_RECTANGLE);
ObjectsDeleteAll();
return(0);
}
//+------------------------------------------------------------------+