Ваши вопросы по языку MQL4

Milord

Местный знаток
PHP:
////////////////////////////////////////////////////////////////////////////////
void Close_all()
{
for(int i=OrdersTotal()-1; i>=0; i--)
 {
 if(OrderSelect(i, SELECT_BY_POS))
 {
 if(OrderMagicNumber()==magic)
 {
 if(OrderSymbol()==Symbol())
 {
 bool ticket_ex=false;
 for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
 {
 while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
 RefreshRates();
 
 if(OrderType()==OP_BUY ) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow); 
 if(OrderType()==OP_SELL) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYLIMIT) ticket_ex=OrderDelete(OrderTicket(),CLR_NONE);
 if(ticket_ex==true)break;
 }
 }
 }
 }
 }
 
}
спасибо за быстрый ответ, жаль нет логики работы,впрочем будем посмотреть)):D
думаю можно код упростить, вопрос будет ли он работать, например отложек у меня нет,магик не важен,символ валюты текущий по счету....вот что получилось...гляньте плиз свежим взглядом будет ли так работать? и куда "пихать" этот кусок кода,я пока что начинающий "ас" MQL4))):D
надеюсь дочитать ваши уроки программирования...)
PHP:
void Close_all()
{
for(int i=OrdersTotal()-1; i>=0; i--)
 {
 if(OrderSelect(i, SELECT_BY_POS))
 {
 bool ticket_ex=false;
 for (int j_ex = 0;j_ex < MaxOrders; j_ex++)
 {
 while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
 RefreshRates();
 
 if(OrderType()==OP_BUY ) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow); 
 if(OrderType()==OP_SELL) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
ticket_ex=OrderDelete(OrderTicket(),CLR_NONE);
 if(ticket_ex==true)break;
 }
 }
 }
 }
 }
 
}
 
Последнее редактирование:

Ugar

Гуру форума
спасибо за быстрый ответ, жаль нет логики работы,впрочем будем посмотреть)):D
думаю можно код упростить, вопрос будет ли он работать, например отложек у меня нет,магик не важен,символ валюты текущий по счету....вот что получилось...гляньте плиз свежим взглядом будет ли так работать? и куда "пихать" этот кусок кода,я пока что начинающий "ас" MQL4))):D
надеюсь дочитать ваши уроки программирования...)
PHP:
void Close_all()
{
for(int i=OrdersTotal()-1; i>=0; i--)
 {
 if(OrderSelect(i, SELECT_BY_POS))
 {
 bool ticket_ex=false;
 for (int j_ex = 0;j_ex < MaxOrders; j_ex++)
 {
 while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
 RefreshRates();
 
 if(OrderType()==OP_BUY ) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow); 
 if(OrderType()==OP_SELL) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Yellow);
ticket_ex=OrderDelete(OrderTicket(),CLR_NONE);
 if(ticket_ex==true)break;
 }
 }
 }
 }
 }
 
}
Проверку на символ можно убирать только если гарантированно не будет ордеров другого символа. Например, при работе в тестере.
При работе в тестере можно упростить, убрав
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();

Это пользовательская функция. Её код надо разместить вне функций start(), init(), deinit()

А внутри функции start() надо просто её вызвать строкой
int start()
{
if(
A>B)
{
OrderSend(.... );
}

if(
t>P)
//закрываем все ордера
{
Close_all();}

return(
0);
}



ps Для работы на реальном счёте надо не упрощать, а усложнять функцию.
 
Последнее редактирование:

matro3

Почетный гражданин
Все же тот код для запрета открытия сделки сразу после закрытия предидущей по стопу не работает.
Проверил принтами в логах:
1. пишет что закрыт первый ордер
2. ответ от функции проверки -1 (нужно больше 0)
3. открывается новый ордер
4. ответ проверки 0 (т.е. текущий бар)

Может это работает так только в тестере, но вопрос остается открытым.
 

Dobryj

Почетный гражданин
Привет!
Помогите разобраться вроде не сложно должно быть :D


extern datetime Start_time=D'2003.08.04 00:00';

int start()
{

datetime Forward_1=Start_time+166*Period()*60;

return(0);
}
прибавляет 166 календарных дней ,
как переделать что бы прибавлял к дате 166 торговых дней(баров)?
 

qqmber

Почетный гражданин
Привет!
Помогите разобраться вроде не сложно должно быть :D


extern datetime Start_time=D'2003.08.04 00:00';

int start()
{

datetime Forward_1=Start_time+166*Period()*60;

return(0);
}
прибавляет 166 календарных дней ,
как переделать что бы прибавлял к дате 166 торговых дней(баров)?

Если нужны бары, то бары и прибавляй - функция iBars
Нет, iBars() тут мимо.
Forward_1=Time[iBarShift(NULL,Period(),Start_time)-166];
История 2003+ года должна быть доступна.
 

ansol

Местный знаток
Нет, iBars() тут мимо.
Forward_1=Time[iBarShift(NULL,Period(),Start_time)-166];
Смотря что ищем. На периоде D1 1 бар=1 день :) В выходные баров нет, т.е. к заданному добавляем 166 и получаем бар через 166 рабочих дней (правда, еще праздники есть :) )
 

AlexeyVik

Программист mql4 mql5
Смотря что ищем. На периоде D1 1 бар=1 день :) В выходные баров нет, т.е. к заданному добавляем 166 и получаем бар через 166 рабочих дней (правда, еще праздники есть :) )
Ты почти у цели. Только iBars возвращает количество баров на графике, а не между датами.
Я не совсем понял вопрос, если надо от прошлой даты посчитать 166 торговых дней, то надо использовать +166*PERIOD_D1*60; Ну а если от текущей вперёд, то наверное придётся брать PERIOD_W1*60 и PERIOD_D1*60
И в этом случае надо чётко понимать как определить количество полных недель и дней в тех 166 днях. Их, как я понимаю, может быть и не 166.
 

Dobryj

Почетный гражданин
Нет, iBars() тут мимо.
Forward_1=Time[iBarShift(NULL,Period(),Start_time)-166];
История 2003+ года должна быть доступна.

Не получается ...
историю подкачал перепроверил все тоже самое !
вот пример от 2003.06.02 отложим 166 баров получим
дату 2004.01.20
при +166*PERIOD_D1*60 будут посчитаны календарные дни !
а надо отложить конкретно 166 свеч от даты (торговых дней)
и еще вопрос если считать в будущее как это с выходными посчитать ?
#property copyright "Dobryjj"
#property link "[email protected]"
#property show_inputs
//-----------------------------INPUT parameters-------------------------------------------------------------------------//
extern datetime Start_time=D'2003.06.02 00:00';

//----------------------------------------------------------------------------------------------------------------------//
int start()
{
datetime Forward_1=Time[iBarShift(NULL,Period(),Start_time)-166];
string var1=TimeToStr(Forward_1,TIME_DATE);
Comment(var1);


return(0);
}
 

Dobryj

Почетный гражданин
Смотря что ищем. На периоде D1 1 бар=1 день :) В выходные баров нет, т.е. к заданному добавляем 166 и получаем бар через 166 рабочих дней (правда, еще праздники есть :) )

Напишите пожалуйста код , не понимаю как ibars использовать при подсчете :)
 

ansol

Местный знаток
Пример из хелпа:
PHP:
datetime some_time=D'2004.03.21 12:00';
int      shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
Т.е. shift мы получили. Теперь из него надо вычесть 166 - это будет бар, который отстоит от полученного вперед на 166 баров.
Вам что нужно в результате, время открытия вычислить из него?
Это будет iTime(символ,PERIOD_D1,shift-166)
Или с самим баром что-то делать?
 

AlexeyVik

Программист mql4 mql5
Не получается ...
историю подкачал перепроверил все тоже самое !
вот пример от 2003.06.02 отложим 166 баров получим
дату 2004.01.20
при +166*PERIOD_D1*60 будут посчитаны календарные дни !
а надо отложить конкретно 166 свеч от даты (торговых дней)
и еще вопрос если считать в будущее как это с выходными посчитать ?
#property copyright "Dobryjj"
#property link "[email protected]"
#property show_inputs
//-----------------------------INPUT parameters-------------------------------------------------------------------------//
extern datetime Start_time=D'2003.06.02 00:00';

//----------------------------------------------------------------------------------------------------------------------//
int start()
{
datetime Forward_1=Time[iBarShift(NULL,Period(),Start_time)-166];
string var1=TimeToStr(Forward_1,TIME_DATE);
Comment(var1);


return(0);
}
А ты проверил это?
PERIOD_D1 это 1 дневная свеча!!! А не календарный день.
А как посчитать вперёд, я предположил перед твоими последними постами. Было-бы нужно это мне, я написал-бы в Comment() дату которая получится и определил-бы как правильней посчитать. Может MathCeil(166/5)*PERIOD_W1*60+(166 % 5)*PERIOD_D1*60
Может делить на 5 дней в неделю, а потом прибавить по 2 дня на неделю. В общем вряд-ли кто будет заниматься такими испытаниями вместо тебя.
 
Последнее редактирование:

Dobryj

Почетный гражданин
Пример из хелпа:
PHP:
datetime some_time=D'2004.03.21 12:00';
int      shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);
Т.е. shift мы получили. Теперь из него надо вычесть 166 - это будет бар, который отстоит от полученного вперед на 166 баров.
Вам что нужно в результате, время открытия вычислить из него?
Это будет iTime(символ,PERIOD_D1,shift-166)
Или с самим баром что-то делать?

мне надо на этом баре вертикальную линию нарисовать .
Спасибо получилось посчитать на истории , а ситуация с будущим , может есть у кого практика прописать виртуальные бары как буд-то они уже существуют )))
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
мне надо на этом баре вертикальную линию нарисовать .
Спасибо получилось посчитать на истории , а ситуация с будущим , может есть у кого практика прописать виртуальные бары как буд-то они уже существуют )))
Aaaaa! Всё-же заставил посчитать....
Поставь куда угодно этот комент и посчитай на календарике какая дата будет через 3 недели и 1 день и сравни с тем что увидишь. Это будет второе января нового года.
Comment(TimeToStr(iTime(NULL, PERIOD_W1, 0)+3*PERIOD_W1*60+(DayOfWeek()+1)*PERIOD_D1*60, TIME_DATE));

iTime(NULL, PERIOD_W1, 0) - время открытия текущей недели
+3*PERIOD_W1*60 - плюс 3 недели
+(DayOfWeek()+1)*PERIOD_D1*60 - плюс прошедшие дни с начала текущей недели и плюс ещё один день

В твоём случае 166 торговых дней это 33 недели и 1 день

Зачем я тут распинаюсь если ты не видишь подсказки... В следующий раз буду игнорировать.:facepalm:

Вот-же было тебе сказано
Ты почти у цели. Только iBars возвращает количество баров на графике, а не между датами.
Я не совсем понял вопрос, если надо от прошлой даты посчитать 166 торговых дней, то надо использовать +166*PERIOD_D1*60; Ну а если от текущей вперёд, то наверное придётся брать PERIOD_W1*60 и PERIOD_D1*60
И в этом случае надо чётко понимать как определить количество полных недель и дней в тех 166 днях. Их, как я понимаю, может быть и не 166.
 
Последнее редактирование:

ctmcn

Новичок форума
Здравствуйте !
Подскажите пожалуйста, кто знает, как реализовать выполнение.

Советник последовательно должен обрабатывать два уровня условий:
Первый уровень обрабатывает критерии на текущих (нулевых) барах таймфреймов с Н4 по М1. Если условия на первом уровне выполнены, то советник переходит к обработке уже критериев только Второго уровня, и только при выполнении условий уже второго уровня, дает команду на открытие ордера.

Выглядит так (для Buy):
________________________________________
Level_1 (четыре варианта)
----------------------------------------------
if ((Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1))
----------------------------------------------
Нужнот вставить сюда Level_2
А<В
----------------------------------------------
{
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell

P.S. Критерии на Level_2 - ВСЕГДА действуют во времени ПОЗЖЕ критериев на Level_1. И поэтому ВСЕГДА, когда выполняются условия на Level_2, то на Level_1 условия уже НЕ ВЫПОЛНЯЮТСЯ.

С уважением,
заранее спасибо.
 

eevviill

Заблокирован
Здравствуйте !
Подскажите пожалуйста, кто знает, как реализовать выполнение.

Советник последовательно должен обрабатывать два уровня условий:
Первый уровень обрабатывает критерии на текущих (нулевых) барах таймфреймов с Н4 по М1. Если условия на первом уровне выполнены, то советник переходит к обработке уже критериев только Второго уровня, и только при выполнении условий уже второго уровня, дает команду на открытие ордера.

Выглядит так (для Buy):
________________________________________
Level_1 (четыре варианта)
----------------------------------------------
if ((Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1) ||
(Н4 && Н1 && М30 && М15 && М5 && М1))
----------------------------------------------
Нужнот вставить сюда Level_2
А<В
----------------------------------------------
{
Opn_B=true; // Критерий откр. Buy
Cls_S=true; // Критерий закр. Sell

P.S. Критерии на Level_2 - ВСЕГДА действуют во времени ПОЗЖЕ критериев на Level_1. И поэтому ВСЕГДА, когда выполняются условия на Level_2, то на Level_1 условия уже НЕ ВЫПОЛНЯЮТСЯ.

С уважением,
заранее спасибо.
Opn_B1=false;
Cls_S1=false;
Объяви на глобальном уровне.
При выполнении условия 1, будешь тру ставить. А<В && Opn_B1
При выполнении условия 2, фолс.
 

eevviill

Заблокирован
Opn_B1=false;
Cls_S1=false;
Объяви на глобальном уровне.
При выполнении условия 1, будешь тру ставить. А<В && Opn_B1
При выполнении условия 2, фолс.

Сейчас разложу по полкам.
Например сигнал для бай.
В глобальных
PHP:
bool open_b1;

Сигнал 1 на бай
if(!open_b1 && ... && ...)
 open_b1=true;

Сигнал 2 на бай
if(open_b1 && ... && ...)
{
...
open_b1=false;
}
 

max020780

Новичок форума
помогите разобраться

помогите разобраться пытаюсь модифицировать два ордера одновременно один отложенный другой открытый так открытый модифицируется без проблем а отложенный намного позже и в придачу когда советник запущен на нескольких парах он модифицирует отложенный по цене открытого ордера по другой валютной паре если ордера открыты в том же направлении

PHP:
if( NumberOfPositionsBay(Symbol())==1 && NumberOfPositionsSell_otl(Symbol())==1 &&GetOrderLotsOtlSell(Symbol())==start_Lot*2 && GetOrderLotsBay(Symbol())==start_Lot)
{

 
      for (int k = 0; k < OrdersTotal(); k++) 
      {
      if (OrderSelect(k,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
//------------------------------------------------------ 3 --
if (OrderSymbol()!= Symbol()) continue; // Не наш фин.инструм.
      
      if (OrderSymbol() == Symbol() && OrderType() == OP_SELLSTOP ) {
     
      tp_sell_otl=NormalizeDouble(s-(2*Point)-spred-(GetOrderPriceBay(Symbol())-(s-Point-spred))/Point/2*Point, Digits);
      sl_sell_otl=NormalizeDouble(GetOrderPriceBay(Symbol()), Digits);
      ModifyOrder(
      OrderModify(OrderTicket(),NormalizeDouble(s-Point-spred, Digits),sl_sell_otl,tp_sell_otl,0);
       
      }
      
       
       if (OrderSymbol() == Symbol() && OrderType() == OP_BUY  ) {
       
      sl_buy_otl=NormalizeDouble(s-spred-Point, Digits);
      OrderModify(OrderTicket(), OrderOpenPrice(),sl_buy_otl,OrderTakeProfit(),0);
      
      }
      }
      }
}
 

eevviill

Заблокирован
1) Надо проверять(для торговли на реал счёте) или ордер уже имеет необходимые параметры.
Например
PHP:
if(OrderStopLoss()!=NormalizeDouble(sl,Digits))
OrderModify(...,NormalizeDouble(sl,Digits),...);

2) Скорее всего неправильные стопы или цена отложки передаются для модификации. Загляни в журнал есть ли там ошибки.
Кто такой s,spred?
 
Последнее редактирование:
Верх