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

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

#5926
7 часов назад, MikR0ReR сказал:

@Svob Можно! Это все делается тоже через объекты. Прошлых сообщения я говорил не только о линиях и об прямоугольниках тоже.

Хм.. Это уже сложнее :)

Пробовал привязаться к цвету прямоугольника через ObjectGet, но возникла загводка с именем прямоугольника. Оно имеет всегда разный порядковый номер, например: А1, А2 и т.д. А в функции имя всегда жёстко прописывается, насколько я понял.
Как можно сделать, чтобы цвет читался именно из последнего?

#5927

@Svob :-W обидно.

есть 5 элементов а1 а2 а3 а4 а5

есть группы "Строковые функции" и "Преобразование данных"

вырезаешь "а" или извлекаешь "№"

остается "№"

вычехляешь последний, то есть большее "5"

к "а" прибавляешь "5" это и будет последнее имя объекта "а5"

 

Как то так.

#5928

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

test_obj_name.mq43 скач.

#5929

@Svob Может потому что нужно смотреть вкладку "Эксперты", а не "Журнал". Скрипт рабочий!

Спойлер

1.jpg.1a2b376de2b31b37283dc9d46eeb2399.jpg

 

#5930

Нужна помощь в вопросе импорта биржевых данных из Quik в MT4 для возможности проведения теханализа с использованием реальных данных, предоставляемых биржей - объемов, открытых позиций, заявок (спрос/предложение) и других.  Тема обширная и непростая, нужен пинок в правильном направлении.

Что знаю и умею- программировал на MQL, VB? VBA под эксель, LUA, немного Паскаль, СИ. Нужна руководящая и направляющая сила (наставник), разбирающийся в вопросах передачи данных по сети и между приложениями (все под винду). Делать готов все сам, но пока даже не понимаю с какой стороны подступиться.

На росбирже у меня открыт реальный счет, торгую уже больше 12 лет. Под МТ4 есть индикатор, который я использую в работе - не грааль, а просто взгляд на рынок под определенным своеобразным углом. Есть также советник, который достаточно легко адаптировать под себя, использую для ММ. Проблема в том, при портировании кода советника в КВИК столкнулся с тем, что разработчики КВИКа не предоставляют доступ к объектам графика, необходимым для построения индикатора (линии, прямоугольники, равноудаленные каналы), соответственно, построить нормальный индикатор не получается. И это не единственный подводный камень, там их много.

Итак, задача, как я её себе представляю, такая - связать два приложения МТ4 и КВИК посредством любого из предоставляемых WINAPI способов (мейлслот, пайп, мейморимаппед, или любого другого, хотя использование промежуточных файлов с записью на диск крайне нежелательно), при этом КВИК должен быть сервером, а МТ4 клиентом. Сервер по запросу клиента предоставляет данные, а клиент, приняв их, в реальном времени строит график, на который можно наложить индикатор (какой, значения не имеет) и запустить советник, который будет генерировать сделки. Как эти сгенерированные сделки передать обратно в КВИК пока не парюсь, до этого сильно далеко.

Буду благодарен за любую помощь.

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

#5931

@VNG_nemo  просмотр чужого потока в МТ4? - даже не слышал о таком, это нужно ломать МТ очень сильно и долго.

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

#5932

Огромное спасибо за ответ.

 

На форуме метаквотов, не помню год, где-то 2011, была выложена либа с помощью которой я воспроизводил тики из таблицы  обезличенных сделок КВИКа на офлайн графике МТ4 посредством вывода этой таблицы через DDE в ЭКСЕЛЬ. Из экселя эта либа транслировала данные из ячейки в МТ4. И ничего ломать было не нужно. В то время еще к КВИКу не прилагалась LUA.dll, поэтому и приходилось использовать костыль. Сейчас же все данные КВИКа легко можно забрать посредством таблиц LUA. Кроме того, к LUA цепляется библиотека FFI, которая позволяет работать с СИ. Копаясь в сети нашел вот такую инфу https://www.forexfactory.com/showthread.php?t=834471, может быть кто-то подскажет как это дело могло бы помочь в решении данной проблемы.

Итого, данные из таблиц КВИКа легко забираются. Их можно без всякого ломания запихнуть непосредственно в МТ4. Вопрос в том, как создать прямой канал передачи таких данных, желательно через сокет.

Покопаюсь и позже выложу ссылки на упомянутую библиотеку для передачи данных через ЭКСЕЛЬ.

 

Upd.  ссылка https://www.mql5.com/ru/code/8175 , по ней вы найдете библиотеку для передачи данных из ЭКСЕЛЬ в МТ4 и примеры ее использования.

Изменено 24 марта, 2020 пользователем VNG_nemo

#5933

Нашел в базе кодов библиотеку сокетов, выполненную полностью на MQL. https://www.mql5.com/en/code/9296

Возможно ли ее прикрутить к поставленной задаче?

#5934

Здравствуйте!

Для советника хотел использовать индикатор A/D, но не в чистом виде, его moving average.

Поскольку я не нашел способа как в стандартную функцию iMA() запихать значение не цены, а показания A/D, поэтому сочинил функции:

//+------------------------------------------------------------------+
//|  Функция A/D                       |
//+------------------------------------------------------------------+
double A_D(ENUM_TIMEFRAMES tf, int shift)
  {
   double res=0;

   res=iAD(NULL,tf, shift);

   return res;


  }

//+------------------------------------------------------------------+
//|  Функция A/D _moving                      |
//+------------------------------------------------------------------+
double A_D_moving(ENUM_TIMEFRAMES tf, int sq_, int shift)
  {
   double res=0;
   double a=0;
 //  sq_=5;

   for(int i=sq_+shift; i>=0+shift; i--)
     {
      a+= A_D(tf, i);


     }
res=a/sq_;
   return res;


  }

Но при тестировании стало очевидно, что значения функции A_D_moving() отличаются от показаний MA натянутой на A/D.

Прошу, кто может, помогите в следующих вопросах:

1.Можно ли в стандартную функцию iMA() запихать значение не цены, а показания A/D?Если да, то как корректно это сделать?

2. Насколько корректно написана функция A_D_moving()? Если есть ошибки прошу указать...

Спасибо!

 

 

#5935
  • @Владимир Стариков iMAOnArray для этого существует чтоб туда пихать не цены.
  • Ошибки есть. Это не подписывать строки, х.з че ты там хотел сделать. Это тебе понятно, для нас х.з че в твоей голове. Распиши, тогда можно будет о чем то говорить.
#5936

Обещанная ссылка на скрипт передачи данных из ЭКСЕЛя в МТ4.

https://www.mql5.com/ru/code/10498

Все проверял на боевом счете, работало на ура.

 

Задача по прежнему состоит в том, чтобы передавать данные минуя эксель посредством таблиц КВИКА напрямую через сокет винды в МТ4. Обработка таблиц легко реализуется на LUA, который встроен в КВИК, к LUA прикручивается библиотека FFI  и WIN API.

 

Кто-нибудь может пнуть в правильном направлении?

Изменено 26 марта, 2020 пользователем VNG_nemo

#5937
1 минуту назад, MikR0ReR сказал:
  • @Владимир Стариков iMAOnArray для этого существует чтоб туда пихать не цены.
  • Ошибки есть. Это не подписывать строки, х.з че ты там хотел сделать. Это тебе понятно, для нас х.з че в твоей голове. Распиши, тогда можно будет о чем то говорить.

Спасибо!

//+------------------------------------------------------------------+
//|  Функция A/D               должна возвращать (по идее) среднее значение за период  sq_      |
//+------------------------------------------------------------------+
double A_D_moving(ENUM_TIMEFRAMES tf, int sq_, int shift)
  {
   double res=0;
   double a=0;

   for(int i=sq_+shift; i>=0+shift; i--)  - цикл набора значений индикатора A/D за период от sq_+shift до 0+shift
     {
      a+= A_D(tf, i);


     }
res=a/sq_;  - вычисление среднего значения индикатора A/D за период от sq_+shift до 0+shift
   return res;


  }

 Про iMAOnArray видел в справке. Но не понимаю как использовать в моем случае. Буду признателен, если поможете...

#5938
  • @Владимир Стариков (0+shift) ставит под сомнение понимание не только что ты делаешь но и математику. 0+1=1, 0+10=10, 0+100=100, просто ставь (shift)
  • Твой график расходится с оригиналом так как МА считает по хитрой формуле. Ты считаешь тупо среднее значение. fcplm
  • Собираешь значения АД в массив и передаешь в iMAOnArray. Чего не понятного? >D-b<
#5939

Добрый день. Не могу поставить панельку - терминал зависает, скорее всего проблема на 252-255 строке кода.
Подскажите пожалуйста в чем может быть проблема

Tabl.rar6 скач.

#5940

@ademen fcplm 

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

Спойлер

error.thumb.jpg.87cb75ef3b824afd740f5027ef44c7b9.jpg

 

#5941

@VNG_nemo когда-то давно писал сокеты для связи двух прог, уже не помню на чём..., тогда всё получилось и работало.

Нужно просто делать - создайте клиента на Квике и сервер на МТ и пытайтесь установить коннект и передачу любой инфы. 

Инфу для передачи нужно упаковать в некий формат типа: 1 байт - код инфы, 8 байт - время, 8 байт - цена.

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

#5942

Приветствую. Появились сомнения в "правильности" некоторой части подаваемой в уроках логики, и вот что на это ответили на форуме MQL:

Andrey Sokolov:

Добрейшего вечера. 

Подскажите, пожалста, уместно ли сравнивать последовательность открытия ордеров из истории по номеру тикета? (Как это делают в известных видео-уроках)

Сомнения возникли от того что OrderSend() возвращает тип int, который не бесконечен, и, предположу, когда-то обнуляется.

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

помимо переполнения это ещё и security-bug, думаю что в неких перспективных релизах это "сломают" и все идентификаторы получаемые с сервера станут непредсказуемы. 

для сохранения последовательности есть метки времени, если их нехватает то magic и comments в помощь

PS/ кстати даже в 4-ке возможны ситуации когда более поздний ордер получит меньший ticket без целочисленного переполнения. Например одновременная работа двух советников на разных чартах в одной стратегии.

 

https://www.mql5.com/ru/forum/160683/page1114#comment_15781243

Прошу принять к сведению, или возразить, если доводы ошибочны.

#5943
В 06.04.2020 в 19:24, spoiltboy сказал:

Прошу принять к сведению, или возразить, если доводы ошибочны.

Int, который может в себе хранить число 2 147 483 647 превысить сложно. У Альпари, где у меня счет открыт более 6 лет сейчас номер тикета 1 477 019 223, а сам брокер я даже не знаю с какого года начал вести нумерацию тикетов. Так что нам еще долго ждать переполнения. А даже, если оно и произодет, то косяк в подсчете ордеров будет только первые 10-20 ордеров после обнуления, потом все встанет на свои места. 
Но вообще, для каждой системы нужно применять разные методы. Если у меня сетка ордеров, которая закрыла сразу в одну секунду 15 ордеров, то я смогу понять, какой был открыт первый только по тикету, либо по торговому лоту, поэтому их и использую в анализе. Если торговля без сетки, то можно сортировать и по времени закрытия. 
Ко всему прочему нужно помнить, что последовательность ордеров у брокера храниться по разному, не всегда по времени закрытия. Т.е. чтобы точно узнать последовательность ордеров по времени закрытия, нужно вначале их добавить в массив, отсортировать по убыванию, а потом уже проводить работу с самим массивом. 
Так или иначе - обучающие курсы показывают только один из вариантов поискать ордеров, ученик же сам пополняет свою базу из практики их применения.

#5944
В 08.04.2020 в 15:22, Rever27 сказал:

Int, который может в себе хранить число 2 147 483 647 превысить сложно. У Альпари, где у меня счет открыт более 6 лет сейчас номер тикета 1 477 019 223, а сам брокер я даже не знаю с какого года начал вести нумерацию тикетов. Так что нам еще долго ждать переполнения. А даже, если оно и произодет, то косяк в подсчете ордеров будет только первые 10-20 ордеров после обнуления, потом все встанет на свои места. 

На демо счетах уже через несколько дней новые ордера были с меньшим тикетом. Да и косяк с первыми ордерами после обнуления может быть критичныи.

#5945

В уроке по трейлинг стоп ошибка.

При такой логике, если сл задается 0 (а здесь он задается 0), то будут сразу модифицированы. Возможно в сточках 1 следует убрать "  || OrderStopLoss()==0 " 

img-2020-04-14-16-53-08.png

Изменено 14 апреля, 2020 пользователем spoiltboy

#5946
44 минуты назад, spoiltboy сказал:

В уроке по трейлинг стоп ошибка.

Я бы вначале добавил условие:

if(TrailingStop > 0) {
}

чтобы при 0 он вообще не использовался.
Под цифрой 1 OrderStopLoss() == 0 нужно убрать. 

И еще в строке 82 два раза повторяется TrailingStep.

И в строке самой модификации не указан текущий OrderTakeProfit(), экспирейшн и цвет. Хз, насколько это критично, но с таким типом записи вроде бы будет ошибка компиляции.

#5947

Здравствуйте! Подскажите начинающему, можно ли к советнику добавить MTF индикатор ( к примеру Ozumandias) , если да то как правильно брать его значения,

в случае если советник стоит на минутном графике данные нужны с дневного ,часового.

 

#5948
3 часа назад, chww сказал:

Подскажите начинающему, можно ли к советнику добавить MTF индикатор ( к примеру Ozumandias) , если да то как правильно брать его значения,

в случае если советник стоит на минутном графике данные нужны с дневного ,часового.

Индикатор не обязан быть МТФ, чтобы взять с него любой период. 

   int Amplitude = 2
   double up = iCustom(Symbol(),PERIOD_H1,"Ozymandias",Amplitude,0,1);
   double down = iCustom(Symbol(),PERIOD_H1,"Ozymandias",Amplitude,1,1);

Данный код берет значение с часового графика PERIOD_H1 на 1 закрытой свече. При том не важно, на какой именно ТФ будет установлен советник с этим кодом. Если нужен на дневках, то меняется на PERIOD_D1.

Значения два, потому что в коде индикатор разбит на 2 буфера, один выдает значение, когда канал идет вверх, второй, когда вниз. Индикатор, который использовал во вложении.

Ozymandias.mq45 скач.

#5949

Спасибо! Изучил половину обучающих уроков, а про периоды что то упустил , всегда "0" ставил еще раз спасибо,

17 минут назад, Rever27 сказал:

Индикатор не обязан быть МТФ, чтобы взять с него любой период. 


   int Amplitude = 2
   double up = iCustom(Symbol(),PERIOD_H1,"Ozymandias",Amplitude,0,1);
   double down = iCustom(Symbol(),PERIOD_H1,"Ozymandias",Amplitude,1,1);

Данный код берет значение с часового графика PERIOD_H1 на 1 закрытой свече. При том не важно, на какой именно ТФ будет установлен советник с этим кодом. Если нужен на дневках, то меняется на PERIOD_D1.

Значения два, потому что в коде индикатор разбит на 2 буфера, один выдает значение, когда канал идет вверх, второй, когда вниз. Индикатор, который использовал во вложении.

Ozymandias.mq4 2 \u043a\u0411 · 1 загрузка

 

#5950

Кто сможет написать 

Написать информационный советник, в котором ордера не открываются.

1.       В окне настроек ввести строку Distance (по умолчанию =4 бара) целое положительное число

2.       При запуске на первом тике произвести анализ текущей ситуации.

3.       Определить Open бара №0. Алерт «Open бара №0=…»

4.       В окне терминала комментарии слева в столбик Заголовок «Алгоритм №1» +(количество строк = Distance):

Алгоритм №1

Бар №1: O1=(Open), Н1=(High), L1=(Low), C1=(Close)

Бар №2: O2=(Open), Н2=(High), L2=(Low), C2=(Close)

Бар №3: O3=(Open), Н3=(High), L3=(Low), C3=(Close)

Бар №4: O4=(Open), Н4=(High), L4=(Low), C4=(Close)

5.       Произвести проверку по поиску максимальное значение High (maxHigh). Алерт: «maxHigh=…, Bar №…»

6.       Произвести проверку по поиску максимальное значение Close(maxClose). Алерт:«maxClose=…, Bar №…»

7.       Произвести проверку по поиску минимальное значение Close(minClose). Алерт: minClose=…, Bar №…»

8.       Произвести проверку по поиску минимальное значение Low(minLow). Алерт: minLow=…, Bar №…»

9.       Отразить эти значения в окне терминала в следующей строке в том же столбике:

maxHigh=…, maxClose=…, minClose=…, minLow=…,

10.   Производить действия с п.6 по п.9 каждый раз при открытии нового бара. То есть все значения должны оставаться неизменными на протяжении формирования нового(нулевого) бара.

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

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