спасибо я попробовал ваш вариант, и результаты абсолютно те же, что и в моем варианте. Сделки так же открываются до тех пор пока не закроется по профиту, и только тогда цикл начинается заново в рамках установленного времени
спасибо я попробовал ваш вариант, и результаты абсолютно те же, что и в моем варианте. Сделки так же открываются до тех пор пока не закроется по профиту, и только тогда цикл начинается заново в рамках установленного времени
А как надо? У Вас в условии открытие ордера при убытке.
Tretyakov Rostyslav #: А как надо? У Вас в условии открытие ордера при убытке.
нет не совсем так написано.
там написано, что мне нужно, чтобы открывался при убытке основного ордера только один доп ордер (только один раз)
а сейчас и у меня и у вас получается так:
открылся осн. ордер - закрылся по убытку, открылся доп ордер №1 - закрылся по убытку, открылся доп ордер №2 уже к доп ордеру №1 - закрылся по убытку..... ну и так далее, пока доп ордер №n не закроется профитом, и только тогда цикл начинается заново
там написано, что мне нужно, чтобы открывался при убытке основного ордера только один доп ордер (только один раз)
а сейчас и у меня и у вас получается так:
открылся осн. ордер - закрылся по убытку, открылся доп ордер №1 - закрылся по убытку, открылся доп ордер №2 уже к доп ордеру №1 - закрылся по убытку..... ну и так далее, пока доп ордер №n не закроется профитом, и только тогда цикл начинается заново
//+-----------------------------------------------------------------------------------------------+//| SMA рабочий.mq4 |//| |//| |//+-----------------------------------------------------------------------------------------------+#property copyright"Copyright 2021"#property link"https://www.mql5.com"#property version"1.00"#property strict//Перечисление всех часов. Это необходимо для меню ввода часа.enum Enum_Hour{
h00=00, //00:00
h01=01, //01:00
h02=02, //02:00
h03=03, //03:00
h04=04, //04:00
h05=05, //05:00
h06=06, //06:00
h07=07, //07:00
h08=08, //08:00
h09=09, //09:00
h10=10, //10:00
h11=11, //11:00
h12=12, //12:00
h13=13, //13:00
h14=14, //14:00
h15=15, //15:00
h16=16, //16:00
h17=17, //17:00
h18=18, //18:00
h19=19, //19:00
h20=20, //20:00
h21=21, //21:00
h22=22, //22:00
h23=23, //23:00
};
// Параметры советникаinputstring sParametersEA = ""; // Параметры советникаinputdouble Lot = 0.01; // Количество лотовinputint StopLoss = 560; // Стоп (SL)inputint TakeProfit = 200; // Тейк (TP)inputint Slippage = 3; // Проскальзование (в пунктах)inputint Magic = 1; // Индентификатор советникаinputint DigitsLot = 2; // Точность лотностиinput Enum_Hour StartHour = h07; //Час начала работы.input Enum_Hour LastHour = h17; //Час окончания работы.inputstring sParametersMA = ""; // Параметры индикатораinputint PeriodMA = 14; // Период мувингаinputint MovingShift = 1; // Сдвиг мувинга// Глобальные переменныеdatetime Start,newbar;
double dMA;
bool order=false;
bool CheckActiveHours()
{
//По умолчанию операции отключеныbool OperationsAllowed=false;
//Проверяем, находится ли текущий час между разрешенными часами работы, если да, то возвращаем true.if(StartHour==LastHour && Hour()==StartHour) OperationsAllowed=true;
if(StartHour<LastHour && Hour()>=StartHour && Hour()<=LastHour) OperationsAllowed=true;
if(StartHour>LastHour && ((Hour()>=LastHour && Hour()<=23) || (Hour()<=StartHour && Hour()>0))) OperationsAllowed=true;
return OperationsAllowed;
}
//+-----------------------------------------------------------------------------------------------+intOnInit()
{
Start = TimeCurrent();
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+-----------------------------------------------------------------------------------------------+voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.if(CheckActiveHours())
{
Alert("Операции разрешены");
// Если нет открытых ордеров, то входим в условиеif(!order && CountOrders()==0)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
{
vOrderOpenBuy(); order=true;
}
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
{
vOrderOpenSell(); order=true;
}
}
}
elseAlert("Операции запрещены");
if(order && CountOrders()==0) // GetTypeLastClosePos()==0) последним закрытым был ордер BUY
{
if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==0)
{
if(OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed))
order=false;
}
if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==1)
{
if(OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"покупка",Magic,0,clrGreen))
order=false;
}
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+int CountOrders()
{
int cnt=0;
int i=OrdersTotal()-1;
for(int pos=i;pos>=0;pos--)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==_Symbol)
{
if(OrderMagicNumber()==Magic) cnt++;
}
}
}
return(cnt);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//| Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if(dMA > Open[1] && dMA < Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(dMA < Open[1] && dMA > Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
if(newbar!=Time[0])
{
// Тикет ордераint iOTi = 0;
iOTi = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
newbar=Time[0];
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
if(newbar!=Time[0])
{
// Тикет ордера int iOTi = 0;
//Print(bCheckOrders());
iOTi = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
newbar=Time[0];
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция модификации ордера |//+-----------------------------------------------------------------------------------------------+void vOrderModify(int iOTi)
{
int iOTy = -1; // Тип ордераdouble dOOP = 0; // Цена открытия ордераdouble dOSL = 0; // Стоп Лоссint iMag = 0; // Идентификатор советникаdouble dSL = 0; // Уровень убыткаdouble dTP = 0; // Уровень прибыли// Выберем по тикету открытый ордер, получим некоторые значенияif(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
{
iOTy = OrderType();
dOOP = OrderOpenPrice();
dOSL = OrderStopLoss();
iMag = OrderMagicNumber();
}
// Если ордер открыл данный советник, то входим в условиеif(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
{
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордерif(dOSL == 0)
{
if(iOTy == OP_BUY)
{
dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
if(iOTy == OP_SELL)
{
dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
}
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция обработки ошибок |//+-----------------------------------------------------------------------------------------------+void vError(int iErr)
{
switch(iErr)
{
case129: // Неправильная ценаcase135: // Цена измениласьcase136: // Нет ценcase138: // Новые ценыSleep(1000);
RefreshRates();
break;
case137: // Брокер занятcase146: // Подсистема торговли занятаSleep(3000);
RefreshRates();
break;
}
}
//+------------------------------------------------------------------+//считаем последний ордер//+------------------------------------------------------------------+int GetTypeLastClosePos(string sy="", int mn=-1) {
datetime t=0;
int i, k=OrdersHistoryTotal(), r=-1;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderType();
}
}
}
}
}
return(r);
}
//+------------------------------------------------------------------+//считаем профит последнего ордера//+------------------------------------------------------------------+double GetProfitLastClosePos(string sy="", int mn=-1) {
datetime t=0;
double pr=0;
int i, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderCloseTime()) pr=OrderProfit()+OrderSwap()+OrderCommission();
}
}
}
}
return(pr);
}
//+------------------------------------------------------------------+
сделки открываются как и задумано (не больше двух подряд), однако на периоде с 01.01.2019 - 19.10.2022 открывается всего 11 сделок и только в течение первого месяца.
выбрал другой инструмент, примерно такой же результат 17 сделок за первый мес.
а должно быть на таком временном отрезке примерно 400-500 сделок.
сделки открываются как и задумано (не больше двух подряд), однако на периоде с 01.01.2019 - 19.10.2022 открывается всего 11 сделок и только в течение первого месяца.
выбрал другой инструмент, примерно такой же результат 17 сделок за первый мес.
а должно быть на таком временном отрезке примерно 400-500 сделок.
Где проблема сам найти не могу пока.
//+-----------------------------------------------------------------------------------------------+//| SMA рабочий.mq4 |//| |//| |//+-----------------------------------------------------------------------------------------------+#property copyright"Copyright 2021"#property link"https://www.mql5.com"#property version"1.00"#property strict//Перечисление всех часов. Это необходимо для меню ввода часа.enum Enum_Hour{
h00=00, //00:00
h01=01, //01:00
h02=02, //02:00
h03=03, //03:00
h04=04, //04:00
h05=05, //05:00
h06=06, //06:00
h07=07, //07:00
h08=08, //08:00
h09=09, //09:00
h10=10, //10:00
h11=11, //11:00
h12=12, //12:00
h13=13, //13:00
h14=14, //14:00
h15=15, //15:00
h16=16, //16:00
h17=17, //17:00
h18=18, //18:00
h19=19, //19:00
h20=20, //20:00
h21=21, //21:00
h22=22, //22:00
h23=23, //23:00
};
// Параметры советникаinputstring sParametersEA = ""; // Параметры советникаinputdouble Lot = 0.01; // Количество лотовinputint StopLoss = 560; // Стоп (SL)inputint TakeProfit = 200; // Тейк (TP)inputint Slippage = 3; // Проскальзование (в пунктах)inputint Magic = 1; // Индентификатор советникаinputint DigitsLot = 2; // Точность лотностиinput Enum_Hour StartHour = h07; //Час начала работы.input Enum_Hour LastHour = h17; //Час окончания работы.inputstring sParametersMA = ""; // Параметры индикатораinputint PeriodMA = 14; // Период мувингаinputint MovingShift = 1; // Сдвиг мувинга// Глобальные переменныеdatetime Start,newbar;
double dMA;
bool order=false;
//+-----------------------------------------------------------------------------------------------+intOnInit()
{
Start = TimeCurrent();
return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+-----------------------------------------------------------------------------------------------+voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.if(order && CountOrders()==0) // GetTypeLastClosePos()==0) последним закрытым был ордер BUY
{
if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==0)
{
if(OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Ask+StopLoss*Point,Bid-TakeProfit*Point,"продажа",Magic,0,clrRed))
order=false;
}
if (GetProfitLastClosePos()<0 && GetTypeLastClosePos()==1)
{
if(OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Bid-StopLoss*Point,Ask+TakeProfit*Point,"покупка",Magic,0,clrGreen))
order=false;
}
}
if(CheckActiveHours())
{
Alert("Операции разрешены");
// Если нет открытых ордеров, то входим в условиеif(CountOrders()==0)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
{
vOrderOpenBuy();
}
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
{
vOrderOpenSell();
}
}
}
elseAlert("Операции запрещены");
}
//+-----------------------------------------------------------------------------------------------+//| Функция проверки открытых оредров |//+-----------------------------------------------------------------------------------------------+int CountOrders()
{
int cnt=0;
int i=OrdersTotal()-1;
for(int pos=i;pos>=0;pos--)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==_Symbol)
{
if(OrderMagicNumber()==Magic) cnt++;
}
}
}
return(cnt);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на покупку |//| Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика |//+-----------------------------------------------------------------------------------------------+bool bSignalBuy()
{
if(dMA > Open[1] && dMA < Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция поиска сигнала на продажу |//+-----------------------------------------------------------------------------------------------+bool bSignalSell()
{
if(dMA < Open[1] && dMA > Close[1])
return(true);
return(false);
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
if(newbar!=Time[0])
{
// Тикет ордераint iOTi = 0;
iOTi = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
{
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
order=true;
}
else// Если нет, то получим ошибку
vError(GetLastError());
newbar=Time[0];
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
if(newbar!=Time[0])
{
// Тикет ордера int iOTi = 0;
//Print(bCheckOrders());
iOTi = OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
{
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
order=true;
}
else// Если нет, то получим ошибку
vError(GetLastError());
newbar=Time[0];
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция модификации ордера |//+-----------------------------------------------------------------------------------------------+void vOrderModify(int iOTi)
{
int iOTy = -1; // Тип ордераdouble dOOP = 0; // Цена открытия ордераdouble dOSL = 0; // Стоп Лоссint iMag = 0; // Идентификатор советникаdouble dSL = 0; // Уровень убыткаdouble dTP = 0; // Уровень прибыли// Выберем по тикету открытый ордер, получим некоторые значенияif(OrderSelect(iOTi, SELECT_BY_TICKET, MODE_TRADES))
{
iOTy = OrderType();
dOOP = OrderOpenPrice();
dOSL = OrderStopLoss();
iMag = OrderMagicNumber();
}
// Если ордер открыл данный советник, то входим в условиеif(OrderSymbol() == Symbol() && OrderMagicNumber() == iMag)
{
// Если Стоп Лосс текущего ордера равен нулю, то модифицируем ордерif(dOSL == 0)
{
if(iOTy == OP_BUY)
{
dSL = NormalizeDouble(dOOP - StopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP + TakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
if(iOTy == OP_SELL)
{
dSL = NormalizeDouble(dOOP + StopLoss * Point, Digits);
dTP = NormalizeDouble(dOOP - TakeProfit * Point, Digits);
bool bOM = OrderModify(iOTi, dOOP, dSL, dTP, 0, clrNONE);
}
}
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция обработки ошибок |//+-----------------------------------------------------------------------------------------------+void vError(int iErr)
{
switch(iErr)
{
case129: // Неправильная ценаcase135: // Цена измениласьcase136: // Нет ценcase138: // Новые ценыSleep(1000);
RefreshRates();
break;
case137: // Брокер занятcase146: // Подсистема торговли занятаSleep(3000);
RefreshRates();
break;
}
}
//+------------------------------------------------------------------+//считаем последний ордер//+------------------------------------------------------------------+int GetTypeLastClosePos(string sy="", int mn=-1) {
datetime t=0;
int i, k=OrdersHistoryTotal(), r=-1;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
r=OrderType();
}
}
}
}
}
return(r);
}
//+------------------------------------------------------------------+//считаем профит последнего ордера//+------------------------------------------------------------------+double GetProfitLastClosePos(string sy="", int mn=-1) {
datetime t=0;
double pr=0;
int i, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (t<OrderCloseTime()) pr=OrderProfit()+OrderSwap()+OrderCommission();
}
}
}
}
return(pr);
}
//+------------------------------------------------------------------+bool CheckActiveHours()
{
//По умолчанию операции отключеныbool OperationsAllowed=false;
//Проверяем, находится ли текущий час между разрешенными часами работы, если да, то возвращаем true.if(StartHour==LastHour && Hour()==StartHour) OperationsAllowed=true;
if(StartHour<LastHour && Hour()>=StartHour && Hour()<=LastHour) OperationsAllowed=true;
if(StartHour>LastHour && ((Hour()>=LastHour && Hour()<=23) || (Hour()<=StartHour && Hour()>0))) OperationsAllowed=true;
return OperationsAllowed;
}
//+------------------------------------------------------------------+
Здравствуйте! Подскажите, как на MQL4 написать функцию, чтобы она находила лот последнего открытого ордера по времени? т.е. ордер может быть открытым (действующим), так и закрытым по StopLoss?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
У меня почему-то это не получалось. Как правильно через if это прописать и как при ordersend это послать?
спасибо я попробовал ваш вариант, и результаты абсолютно те же, что и в моем варианте. Сделки так же открываются до тех пор пока не закроется по профиту, и только тогда цикл начинается заново в рамках установленного времени
спасибо я попробовал ваш вариант, и результаты абсолютно те же, что и в моем варианте. Сделки так же открываются до тех пор пока не закроется по профиту, и только тогда цикл начинается заново в рамках установленного времени
А как надо? У Вас в условии открытие ордера при убытке.
нет не совсем так написано.
там написано, что мне нужно, чтобы открывался при убытке основного ордера только один доп ордер (только один раз)
а сейчас и у меня и у вас получается так:
открылся осн. ордер - закрылся по убытку, открылся доп ордер №1 - закрылся по убытку, открылся доп ордер №2 уже к доп ордеру №1 - закрылся по убытку..... ну и так далее, пока доп ордер №n не закроется профитом, и только тогда цикл начинается заново
нет не совсем так написано.
там написано, что мне нужно, чтобы открывался при убытке основного ордера только один доп ордер (только один раз)
а сейчас и у меня и у вас получается так:
открылся осн. ордер - закрылся по убытку, открылся доп ордер №1 - закрылся по убытку, открылся доп ордер №2 уже к доп ордеру №1 - закрылся по убытку..... ну и так далее, пока доп ордер №n не закроется профитом, и только тогда цикл начинается заново
благодарю, попробую
что то не так.
сделки открываются как и задумано (не больше двух подряд), однако на периоде с 01.01.2019 - 19.10.2022 открывается всего 11 сделок и только в течение первого месяца.
выбрал другой инструмент, примерно такой же результат 17 сделок за первый мес.
а должно быть на таком временном отрезке примерно 400-500 сделок.
Где проблема сам найти не могу пока.
что то не так.
сделки открываются как и задумано (не больше двух подряд), однако на периоде с 01.01.2019 - 19.10.2022 открывается всего 11 сделок и только в течение первого месяца.
выбрал другой инструмент, примерно такой же результат 17 сделок за первый мес.
а должно быть на таком временном отрезке примерно 400-500 сделок.
Где проблема сам найти не могу пока.
спасибо! заработало всё как надо.