Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
и где это все это есть? вы это записываете куда-то в переменную или массив? покажите сначала где вы это храните, дальше будет видно что дальше делать.
Хорошо, тогда по полочкам: есть время закрытия ордеров, есть тикет или номер ордеров которые совпадают по времени закрытия. Как это объединить и посчитать профит этих ордеров?
Вроде не сложно, но так и не понятно.
Пока ни кто не может понять выделил красным, каких этих. Нужны точные критерии поиска этих ордеров. По этому постарайтесь объяснить, как говориться на пальцах, с картинками и так далее
?
Почему это никто не может понять, Вы имели ввиду себя скорее всего?
Всё уже давно понятно.
Мадам просто хочет сделать самостоятельно, не афишируя подробности своей программы.
Пока ни кто не может понять выделил красным, каких этих. Нужны точные критерии поиска этих ордеров. По этому постарайтесь объяснить, как говориться на пальцах, с картинками и так далее
Да Я уже дал абсолютно 100% рабочее условие и приложил это ввиде готового кода. При этом нужно заметить то, что в коде используется способ, которому не страшны перезагрузки терминала, и при включении терминала ничего не потеряется и продолжит работать. Но тут изобретают велосипед, который будет работать только в тестере.
Sergey, так-же обратите внимание, в оригинальном коде ТС при закрытии серии с 5 позиций, так-же удаляется ордер в середине закрытия, это в свою очередь ни к чему хорошему не приведёт в реальной торговле. В общем, всем всё понятно, кроме ТС.
//| Natashe4ka.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
input int Magic=1;//Identification number
double Profit=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
color ProfitColor=0;
// START //
LastProfitCL_1(Profit,TimeCurrent(),-1);
if(Profit<0)ProfitColor=clrRed;
else if(Profit>0)ProfitColor=clrLimeGreen;
else ProfitColor=clrDarkGray;
ObjectCreate("Last Profit",OBJ_LABEL,0,0,0);
ObjectSet("Last Profit",OBJPROP_CORNER,1);
ObjectSet("Last Profit",OBJPROP_XDISTANCE,5);
ObjectSet("Last Profit",OBJPROP_YDISTANCE,15);
ObjectSetText("Last Profit",StringConcatenate("Last Profit: ",DoubleToStr(Profit,2)),10,"Arial",ProfitColor);
// END START //
}
//+------------------------------------------------------------------+
//Вариант 1
//+------------------------------------------------------------------+
bool LastProfitCL_1(double &LastProfit,//сюда записываем профит
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderCloseTime()!=timecurent)continue;
if(OrderType()==op || op==-1)
{
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Вариант 2 |
//+------------------------------------------------------------------+
bool LastProfitCL_2(double &LastProfit,//сюда записываем профит
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
if(OrderSelect(total-1,SELECT_BY_POS,MODE_HISTORY))
{
timecurents=OrderCloseTime();
}
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderCloseTime()<timecurents)continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderType()==op || op==-1)
{
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
//+------------------------------------------------------------------+
Внес исправления во второй вариант функции
datetime timecurent,// текущее время
int op=-1//"op" позиция (-1 любая позиция)
)
{
double profit=0;
int cnt=0;
datetime timecurents=0;
int total=OrdersHistoryTotal();
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderType()>1)continue;// исключим удаленные отложенные ордера
if(OrderType()!=op && op!=-1)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(timecurents==0)timecurents=OrderCloseTime(); // запомним время последнего закрытого ордера
if(OrderCloseTime()<timecurents)continue;
profit+=OrderProfit()+OrderCommission()+OrderSwap();
cnt++;
}
if(cnt!=0)
{
LastProfit=profit;
return(true);
}
return(false);
}
..........
Внес исправления во второй вариант функции
Спасибо за помощь.
Вариант 1 не правильно работает
Вариант 2 работает правильно.
И мой вариант тоже работает правильно, но если ордера переносятся на другой день и больше, то значение просчета не понятное получается профит 190, а должно быть 4,27
См. скрин №3 https://www.mql5.com/ru/forum/162930/page3
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
datetime t=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
if (t<OrderCloseTime()) {t=OrderCloseTime();}
if ((op<0||OrderType()==op) && t==OrderCloseTime()) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
Как оказалось проблема не в кол-ве ордеров а в переносе ордеров на другой день и более.
Так вы серией закрываете или как? Что за перенос, если все ордера закрыть за один цикл?
Ордера закрываются серией, но если условий для закрытия нет, то ордера собираются день-два и т.д.
Хотя кол-во ордеров тоже влияет на значение профита.
Если больше 3-х ордеров, то значение берётся последнего закрытого ордера только.