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

eevviill2

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

Посмотреть вложение 281026

сам кусок кода и исправьте ,пожалуйста

...
PHP:
if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop_1*Point,Digits), OrderTakeProfit(), 0, CLR_NONE))continue;
 

vladradon

Программист
пожалуйста помогите исправить ошибку,может и не критическая, но порядок в коде важнее всякой мелочи.
Привет! Это не ошибка. Компилятор пишет, что результат работы функции OrderModify нужно проверять, т.е. чтобы это сообщение не выскакивало, нужно задать, к примеру, интовскую переменную int x=0; и строки с модификацией начинать x=OrderModify(...); где в х будет записываться код результата работы функции. Ну а будешь ты его (код) дальше использовать в случае ошибки или нет - для компилятора уже не важно будет. Это, кстати, касается всех функций, работающих с ордерами, но если использовать типа if(!OrderModify(...)) Print"Error"; то проверка выполнения будет автоматической и компилятор тоже ругаться не будет.
 
Последнее редактирование:

panand

Местный знаток
Достаточно загуглить и найти пример кода на _https://docs.mql4.com/ru/trading/ordermodify
спасибо за подсказку
переделал
if(OrderType()==OP_BUY) {
if(NormalizeDouble(Bid-OrderOpenPrice(),Digits)>NormalizeDouble(TrailingStop_1*Point,Digits)) {
if(NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-(TrailingStop_1+TrailingStep_1-1)*Point,Digits))
bool res=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop_1*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
}
}

if(OrderType()==OP_SELL) {
if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop_1*Point,Digits)) {
if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop_1+TrailingStep_1-1)*Point,Digits))
bool res=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop_1*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
if(!res)
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
Print("Цена Stop Loss ордера успешно модифицирована.");
}
и что опять не так ?

thumb_show.php
 

panand

Местный знаток
PHP:
if(OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop_1*Point,Digits), OrderTakeProfit(), 0, CLR_NONE))continue;
дякую
Привет! Это не ошибка. Компилятор пишет, что результат работы функции OrderModify нужно проверять, т.е. чтобы это сообщение не выскакивало, нужно задать, к примеру, интовскую переменную int x=0; и строки с модификацией начинать x=OrderModify(...); где в х будет записываться код результата работы функции. Ну а будешь ты его (код) дальше использовать в случае ошибки или нет - для компилятора уже не важно будет. Это, кстати, касается всех функций, работающих с ордерами, но если использовать типа if(!OrderModify(...)) Print"Error"; то проверка выполнения будет автоматической и компилятор тоже ругаться не будет.
спасибо ,буду учитывать
 

vladradon

Программист
Всем привет! Кто-нибудь сталкивался с такой непоняткой: в тестере стартую с депо 100 и через пол года тестирования, когда на балансе уже за 200 000, тестер выдает close at stop, хотя еще больше года тестирования дальше и баланс остается около 40 000. Остановка тестирования именно тестерная - не сова!:facepalm: Что за "волшебные" котировки я скачал?:D
 
Последнее редактирование:

on220

Интересующийся
Доброго всем!Сильно не пинайте я в этом совсем новичок(.Так вот какая проблемка:надо открыть два buy к примеру по двум машкам,одна 50 и другая 200 как только ask больше.Но открыть разово по каждому условию,и независимо друг от друга.(от ОрдерТотал они как я понял зависимы).как это реализавать не подскажите?
Может у кого есть подобный кусок кода,функция там какая не знаю..
 

vladradon

Программист
Доброго всем!Сильно не пинайте я в этом совсем новичок(.Так вот какая проблемка:надо открыть два buy к примеру по двум машкам,одна 50 и другая 200 как только ask больше.Но открыть разово по каждому условию,и независимо друг от друга.(от ОрдерТотал они как я понял зависимы).как это реализавать не подскажите?
Разделить можно либо меджиками, либо комментами, либо и темм другим одновременно. К примеру:
if(OrdersTotalMagic (magic1)<1) ... проверка 1-й машки на сигнал и открытие ордера
if(OrdersTotalMagic (magic2)<1) ... проверка 2-й машки на сигнал и открытие ордера
Функция подсчета ордеров по меджику на данном инструменте
PHP:
int OrdersTotalMagic (int magic)
{
  int totalmagic=0;
  for(int i=0; i<OrdersTotal(); i++) 
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
		 if(OrderSymbol()==_Symbol && OrderMagicNumber()==magic) 
			totalmagic++;
  return(totalmagic);
}
Параметры magic1 и magic2 - соответственно задаются где-то заранее во входных переменных или просто в переменных сова (если жестко привязывать меджики).
Только если действительно машка используется в качестве сигнала, то может быть стоит подумать еще о том, чтобы сигнал с нее не поступал постоянно по каждому тику (машка, как и многие другие индюки, асинхронна и может выдавать сигнал какое-то время). Если машка выдала сигнал на открытие, меняется значение флаговой переменной, которое запрещает открытие ордеров в том же направлении, даже если ордер был открыт и закрылся, пока машка не просигналит нейтрал или противоположный сигнал, который сбросит значение флаговой переменной в разрешающий очередное открытие в нужном направлении.
 
Последнее редактирование:

on220

Интересующийся
vladradon,
Ну спасибо вам огромное,все работает!а то я часов 20 убил в поисках этого,если не больше.
По поводу машек:да там у меня на пересечении со второго бара.С флагами я пока тоже не ас,но со временем надеюсь разберусь.Спасибо огромное еще раз!)
 

Vik940

Почетный гражданин
Всем привет!
Помогите разобраться в написании советника по шаблону. Например советник выставляет ордер при закрытии свечи выше верней линии Envelopes - Sell, а ниже нижней линии Buy. Как коректировать ширину канала от угла наклона трендовой линии.
Или проще говоря Как значение буффера одного индикатора вставить в настройки другого индикатора.
HTML:
extern string Indicators_=" Настройки индикатора Угол наклона";
extern int Bar_Tr = 10;
extern string Indicators__=" Настройки индикатора Envelopes";
extern int EnvPeriod = 3;
extern int EnvMethod = 2;
extern int EnvPrice = 4;
extern double EnvUpperDev1 = 0.1;
extern double EnvLowerDev1 = 0.1;
extern int Shift = 0;

//===========================================================================//
int IndicatorSignal()
  {
   int Sig=0;

      
     
          ExaTrend=iCustom(Symbol(),0,"Угол наклона",Bar_Tr,2,1) ; 
         EnvUpperDev =  EnvUpperDev1+ExaTrend ; 
        EnvLowerDev =  EnvLowerDev1+ExaTrend ;    
               
            double l_ienvelopes_Big = iEnvelopes(NULL, 0, EnvPeriod, EnvMethod, 0, EnvPrice, EnvUpperDev, MODE_UPPER, Shift+1);
            double l_ienvelopes_Min = iEnvelopes(NULL, 0, EnvPeriod, EnvMethod, 0, EnvPrice, EnvLowerDev, MODE_LOWER, Shift+1);
           double ienvelopes_Big = iEnvelopes(NULL, 0, EnvPeriod, EnvMethod, 0, EnvPrice, EnvUpperDev, MODE_UPPER, Shift);
           double ienvelopes_Min = iEnvelopes(NULL, 0, EnvPeriod, EnvMethod, 0, EnvPrice, EnvLowerDev, MODE_LOWER, Shift);

/*       Блок сигналов    */

   if(Close[Shift+1] > l_ienvelopes_Min && Close[Shift] < ienvelopes_Min) Sig=1;// BUY
   if(Close[Shift+1] < l_ienvelopes_Big && Close[Shift] > ienvelopes_Big ) Sig=2;// SELL


                            // 1 - бай  2 - селл
   return(Sig);
  }
так не получается.
 

Вложения

  • Шаблон для написания советника.mq4
    33,1 КБ · Просмотры: 25
  • Угол наклона.mq4
    6 КБ · Просмотры: 25

vladradon

Программист
С флагами я пока тоже не ас
Флаговые переменные - это переменные типа bool, которые имеют 2 значения типа false и true, либо переменные с бОльшим диапазоном значений, которое проверяется типа if(PP!>MX && PP!<MI) ..какое-то действие;
В твоем случае (насколько я понимаю - я же не знаю твой алгоритм)
Прописываем вне основной функции (как общие переменные - глобальные - для всех функций)
PHP:
bool PM1=False;
bool PM2=False;
//Это уже втыкаем в основную функцию (OnTick(), OnTimer() и т.п.)
if(OrdersTotalMagic (magic1)<1 && !PM1) 
 {... проверка 1-й машки на сигнал и 
   {
    открытие ордера
    PM1 = true;
   }
 }
if(OrdersTotalMagic (magic2)<1 && !PM2) 
 {... проверка 2-й машки на сигнал и 
   {
    открытие ордера
    PM2 = true;
   }
 }
if(PM1 && проверка сигнала 1-й машки и если отбой) PM1=false;
if(PM2 && проверка сигнала 2-й машки и если отбой) PM2=false;
 
Последнее редактирование:

vladradon

Программист
Помогите разобраться в написании советника по шаблону
"Угол наклона" - взломанный индюк! Если Вы не в курсе этого, то обоснуйте использование именно этого индикатора - можно просто переписать по алгоритму и снять данные, не ущемляя прав прогера, который первым его написал.
 
Последнее редактирование:

Vik940

Почетный гражданин
"Угол наклона" - взломанный индюк! Если Вы не в курсе этого, то обоснуйте использование именно этого индикатора - можно просто переписать по алгоритму и снять данные, не ущемляя прав прогера, который первым его написал.

Какой индикатор мне без разницы, меня интересует как можно в коде советника буфер одного индикатора вставить в настройки другого, а для примера можно взять и "масд", 0 буфер, вместо "Угол наклона".
 

Elvis Burunduk

Элитный участник
vladradon,
Привет, Влад, вот тебе не лень все объяснять, :)
я уже просто пропускаю такие посты...
Это жуется уже десятилетия тут, а новички все прибывают со своими вопросами.. :)
Многим лень нажать F1 и получить ответ... :)
 

vladradon

Программист
Привет, Влад, вот тебе не лень все объяснять,
я уже просто пропускаю такие посты...
Это жуется уже десятилетия тут, а новички все прибывают со своими вопросами..
Многим лень нажать F1 и получить ответ...

Какой индикатор мне без разницы, меня интересует как можно в коде советника буфер одного индикатора вставить в настройки другого, а для примера можно взять и "масд", 0 буфер, вместо "Угол наклона".
Через сова сделать не получится - можно расчет одного индюка заложить в другого напрямую в сам код.
 

eevviill2

Местный знаток
Не могли-бы вы показать это на примере , изменение ширины канала "Envelopes" от показаний буфера "MACD".
PHP:
extern double env = 0.2;
double env_real=env;
double env_buf[];
...
for(int i=0;i<Bars-20;i++)
{
env_real=enf_real_f();
env_buf[i]=iEnvelopes(...,env_real,...);
}
...
double enf_real_f()
{
double res=env;
double macd=iMACD(...);
if(macd>0) res=0.1;
else
if(macd<0) res=0.3;

return(res);
}
 
Верх