Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#6501
15 минут назад, diodio сказал:

Кто может поделиться кусочком грамотного кода, где увеличивается лот при увеличении эквити.

Изучи, там много вопросов может возникнуть
https://www.google.com/search?q=mql4+расчет+лота+site:www.mql5.com&newwindow=1&sxsrf=AOaemvJhwNygOxAnPotkv3VZ43S8pQ_ZrQ:1635932930130&sa=X&ved=2ahUKEwiGvrSJ9fvzAhXpwosKHXZwDzgQrQIoBHoECAUQBQ&biw=1420&bih=733&dpr=1.25

#6502

Доброго времени суток. 

 

Покажите, пожалуйста, как должен выглядеть блок кода при следующей задаче:

 
Дано N свечей назад. Найти в них свечи размером >= X пунктов, запомнить их общее количество и размер каждого из них. Если текущая свеча после закрытия оказалась >= X пунктов, то сравнить её размер с общим кол-вом найденных свечей и вывести следующий результат - какое место она занимает по размеру среди всех найденных.
 
На мкл сайте затруднились выполнить, но указали на использование массивов. 
#6503
11 часов назад, Capital Plus сказал:

но указали на использование массивов. 

тоже сначала подумал о массиве, потом увидел, что можно отказаться

extern int        CandleCount   = 10; // количество исторических свечей
extern int        CandleSize     = 10; // мин. размер свечи

//int      ArrCandle[];
datetime PrevBarTime;
MqlRates rate[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //ArrayResize(ArrCandle, CandleCount);
   //ArrayInitialize(ArrCandle,0);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   int n = 0; // количество найденных свечей большого размера
   int SizeCandle1 = 0; //  размер последней свечи
   int k = 0; // количество свечей бОльшего размера, чем свеча 0
   
   if(PrevBarTime != iTime(Symbol(),PERIOD_CURRENT,0)) 
   {     
      PrevBarTime = iTime(Symbol(),PERIOD_CURRENT,0);
      //ArrayInitialize(ArrCandle,0);
      CopyRates(_Symbol,PERIOD_CURRENT,1,CandleCount,rate);  
      SizeCandle1 = (int)(MathAbs(rate[CandleCount-1].close - rate[CandleCount-1].open)/_Point);
      
      if(SizeCandle1 >= CandleSize)
      {
         for(int i=0; i < CandleCount; i++)
         {
            int size = (int)(MathAbs(rate[i].close - rate[i].open)/_Point);
            
            if( size >= CandleSize) 
            {
               //ArrCandle[n] = size;
               n++;
               if(size > SizeCandle1) k++;
            }
         }
         
         Print(TimeToString(TimeCurrent(),TIME_MINUTES)," , Last Candle ",SizeCandle1, 
                                                        " , Total big candle ",n,
                                                        " , Bigest candle ", k);
      } 
   }

 

#6504
3 часа назад, usver73 сказал:

тоже сначала подумал о массиве, потом увидел, что можно отказаться

extern int        CandleCount   = 10; // количество исторических свечей
extern int        CandleSize     = 10; // мин. размер свечи

//int      ArrCandle[];
datetime PrevBarTime;
MqlRates rate[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //ArrayResize(ArrCandle, CandleCount);
   //ArrayInitialize(ArrCandle,0);
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   int n = 0; // количество найденных свечей большого размера
   int SizeCandle1 = 0; //  размер последней свечи
   int k = 0; // количество свечей бОльшего размера, чем свеча 0
   
   if(PrevBarTime != iTime(Symbol(),PERIOD_CURRENT,0)) 
   {     
      PrevBarTime = iTime(Symbol(),PERIOD_CURRENT,0);
      //ArrayInitialize(ArrCandle,0);
      CopyRates(_Symbol,PERIOD_CURRENT,1,CandleCount,rate);  
      SizeCandle1 = (int)(MathAbs(rate[CandleCount-1].close - rate[CandleCount-1].open)/_Point);
      
      if(SizeCandle1 >= CandleSize)
      {
         for(int i=0; i < CandleCount; i++)
         {
            int size = (int)(MathAbs(rate[i].close - rate[i].open)/_Point);
            
            if( size >= CandleSize) 
            {
               //ArrCandle[n] = size;
               n++;
               if(size > SizeCandle1) k++;
            }
         }
         
         Print(TimeToString(TimeCurrent(),TIME_MINUTES)," , Last Candle ",SizeCandle1, 
                                                        " , Total big candle ",n,
                                                        " , Bigest candle ", k);
      } 
   }

 

Как оперативно!
Еще и с комментариями. 
Спасибо большое, попробую разобраться

#6505

Доброго времени суток! Вопрос такой, не могу понять почему не закрываются позиции при противоположном сигнале индикатора. Беру сигнал на открытие с первого бара, если на нулевом появился сигнал, то на первом баре открывается позиция. Но вот закрытие не происходит при противоположном сигнале индикатора. Что делать? Если настроить снятие сигнала с нулевого бара, то возможно будет закрытие? Хотя открытие же происходит на первом баре после сигнала, значит и закрытие должно так работать?!

#6506
47 минут назад, diodio сказал:

Беру сигнал на открытие с первого бара, если на нулевом появился сигнал, то на первом баре открывается позиция.

Бред.
Сигнал ты можешь получить на открытии 0-го бара. После анализа 1-го.
И открыть позу можешь тоже только на 0-м (текущем) баре. Т.к. нумерация баров идет в обратном порядке, т.е. 0-й - это текущий, 1-й- это последний ЗАКРЫТЫЙ бар.

49 минут назад, diodio сказал:

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

ошибка в коде

#6507

Здравствуйте, подскажите как сделать что бы отключался первый трейлинг стоп при включении второго трейлинг стопа

#6508

Доброго времени суток.
Подскажите, пожалуйста, как можно посчитать тики или свечи за большое время? (год, например). 


Пробую через Close[], но индекс больше 5000 не дает. 

#6509
1 час назад, Capital Plus сказал:

Подскажите, пожалуйста, как можно посчитать тики или свечи за большое время? (год, например). 

Справка mql4: доступ к  свечам
https://docs.mql4.com/ru/series/copyrates
Справка mql5: доступ к тикам
https://www.mql5.com/ru/docs/series/copyticksrange
в mql4 такого нет

#6510

  Доброго времени суток! 

Подскажите пожалуйста код, который бы при наборе сетки лотов против тренда, открывал и по тренду увеличено в соотношении процента  

#6511
8 часов назад, Lexa000 сказал:

Подскажите пожалуйста код, который бы при наборе сетки лотов против тренда, открывал и по тренду увеличено в соотношении процента  

Этот "кусок кода" будет тянуть на приличный  советник по своему объему.
Ищите по запросу "локирование".
С точки зрения пользы такого алгоритма- это бесполезное (как минимум) и даже вредное занятие: локирование равноценно закрытию существующих ордеров

#6512
5 часов назад, usver73 сказал:

Этот "кусок кода" будет тянуть на приличный  советник по своему объему.
Ищите по запросу "локирование".
С точки зрения пользы такого алгоритма- это бесполезное (как минимум) и даже вредное занятие: локирование равноценно закрытию существующих ордеров

Мне для эксперимента, я многое перепробовал, не получается

#6513
7 минут назад, Lexa000 сказал:

Мне для эксперимента, я многое перепробовал, не получается

но ведь не получается что-то конкретное?
Логично задать "узкий" вопрос.
У локеров много всяких условий и чужой код не факт, что поможет.
Начните делать и по ходу пьесы задавайте вопросы

#6514
6 минут назад, usver73 сказал:

но ведь не получается что-то конкретное?
Логично задать "узкий" вопрос.
У локеров много всяких условий и чужой код не факт, что поможет.
Начните делать и по ходу пьесы задавайте вопросы

Здесь 130 ошибка, лок уже есть, но он не работает так как нужно. В определенное время начинает открывать в одном направлении

Locomotive v1.01 (72).mq45 скач.

#6515
24 минуты назад, Lexa000 сказал:

Здесь 130 ошибка

Смешно...
ошибка 130- "Неправильные стопы".
Останавливайте в этот момент тестер, разбирайтесь- что неправильно (как правило неверная цена ордера/СЛ/ТП).
добавьте после OrderSend() что-то типа:
if(ticket < 0) Print(GetLastError," ", " Bid ", Bid, " Ask", Ask, " SL", SL, " TP ", TP);  и т.д.
То же самое после OrderModify()
п.с. Советник не запускается без индикатора cannot open file '\\MQL4\indicators\MarketInsider_v1.2.ex4' [2]

#6516
4 часа назад, usver73 сказал:

Смешно...
ошибка 130- "Неправильные стопы".
Останавливайте в этот момент тестер, разбирайтесь- что неправильно (как правило неверная цена ордера/СЛ/ТП).
добавьте после OrderSend() что-то типа:
if(ticket < 0) Print(GetLastError," ", " Bid ", Bid, " Ask", Ask, " SL", SL, " TP ", TP);  и т.д.
То же самое после OrderModify()
п.с. Советник не запускается без индикатора cannot open file '\\MQL4\indicators\MarketInsider_v1.2.ex4' [2]

Спасибо за подсказку

 if (Ticket <= 0) { PnC(StringConcatenate("Открыт ордер ",Ticket),0); 

Здесь поменял знак и советник стал работать по другому

#6517

Приветствую всех!
Отдельный респект тем, кто помогает, жертвуя своим личным временем, отвечая на порой достаточно простые вопросы. 
С товарищем пишем помощника в виде дополнительного советника, для автоматизации некоторых ручных действий. Автоматизировали сдвиг тейк-профитов. Реализовали кнопки для принудительного закрытия ордеров вблизи ТП одной кнопкой и т. д.
Теперь есть следующая задача: 
Сначала ситуация: работает робот на 10 парах. Фактически свой робот со своими настройками на каждой паре.
Необходимо из Помощника одной кнопкой менять текущие параметры во всех 10-ти роботах.
Например снять галочки "разрешить советнику торговать". Другой кнопкой увеличить шаг между ордерами и т. д.
Вопрос: где хранятся текущие настройки (путь, названия файлов, или они хранятся в реестре) всех этих 10-ти советников, чтобы при помощи команд из помощника их суметь отредактировать?

Изменено 15 ноября, 2021 пользователем DUBROV

#6518
1 час назад, DUBROV сказал:

Теперь есть следующая задача: 
Сначала ситуация: работает робот на 10 парах. Фактически свой робот со своими настройками на каждой паре.
Необходимо из Помощника одной кнопкой менять текущие параметры во всех 10-ти роботах.
Например снять галочки "разрешить советнику торговать". Другой кнопкой увеличить шаг между ордерами и т. д.
Вопрос: где хранятся текущие настройки (путь, названия файлов, или они хранятся в реестре) всех этих 10-ти советников, чтобы при помощи команд из помощника их суметь отредактировать?

Привет, есть глобальные переменные терминала, они видны всем советникам.

Изменено 16 ноября, 2021 пользователем ademen

#6519

Подскажите, пожалуйста, а можно как-то историю порезать? Когда загружаешь, то загружается лет за 20, а нужна года 2-3 назад... 

#6520
11 часов назад, Capital Plus сказал:

Подскажите, пожалуйста, а можно как-то историю порезать? Когда загружаешь, то загружается лет за 20, а нужна года 2-3 назад... 

Как загружаете? 

#6521
21 час назад, ademen сказал:

Как загружаете? 

Через архив котировок. Выбираю каждую нужную пару и жму загрузить

#6522
3 часа назад, Capital Plus сказал:

Через архив котировок. Выбираю каждую нужную пару и жму загрузить

Тогда выбрать не получится 

#6523
В 16.11.2021 в 00:21, ademen сказал:

Привет, есть глобальные переменные терминала, они видны всем советникам.

Возможно вы неправильно меня поняли, поэтому и ответ получился слишком поверхностным.
Уточню. Мне нужно знать, где терминал хранит значения параметров каждого из 10-ти экземпляров советника (10 разных пар), чтобы я смог написать скрипт, который одним нажатием кнопки, меняет эти параметры. Во вложении сохранённые параметры советника одной из пар. Их, допустим 10. Значения параметров могут у всех пар отличаться. Где эти значения хранятся? Чтобы я мог скриптом, например, увеличить Divider c 20 до 40 у всех 10-ти пар (советников).

set01.JPG

 

 

Изменено 19 ноября, 2021 пользователем DUBROV

#6524
10 часов назад, DUBROV сказал:

Возможно вы неправильно меня поняли, поэтому и ответ получился слишком поверхностным.
Уточню. Мне нужно знать, где терминал хранит значения параметров каждого из 10-ти экземпляров советника (10 разных пар), чтобы я смог написать скрипт, который одним нажатием кнопки, меняет эти параметры. Во вложении сохранённые параметры советника одной из пар. Их, допустим 10. Значения параметров могут у всех пар отличаться. Где эти значения хранятся? Чтобы я мог скриптом, например, увеличить Divider c 20 до 40 у всех 10-ти пар (советников).

set01.JPG

То что вы показали на скрине - глобальные параметры советника, видимые только советникам.

Если вы хотите что бы советники общались между собой - рекоммендую это сделать через глобальные перемены терминала, что надежнее всего. Так же можете попробовать например сохранять параметры в текстовый файл и в дальнейшем работать с ним 

#6525
10 часов назад, ademen сказал:

То что вы показали на скрине - глобальные параметры советника, видимые только советникам.

Если вы хотите что бы советники общались между собой - рекоммендую это сделать через глобальные перемены терминала, что надежнее всего. Так же можете попробовать например сохранять параметры в текстовый файл и в дальнейшем работать с ним 

Большое Спасибо за ответ!!! Немного более ясно становится. Т. е. глобальные параметры советника никаким образом из другого советника отредактировать нельзя? А команды, чтобы из одного советника выгрузить параметры другого в *.set-файл и потом загрузить отредактированные обратно, есть?

PS: доступа к коду торгующего советника нет. 

Изменено 19 ноября, 2021 пользователем DUBROV

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025