Jump to content

Общие вопросы по языку MQL


Recommended Posts

Ugar68
36 минут назад, Mighty Mouse сказал:

 

Имеется дата, время некоего бара, можно узнать его OHLC не вычисляя сдвиг относительно края, что требуется для iOpen, iClose и тд?

Есть ли более простое и элегантное решение?

Я не знаю такого. А что iBarShift это не простое и элегантное решение? Мне кажется это очень удобный инструмент. Похоже не только мне, если его добавили в MQL5.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
  • Replies 7.6k
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    577

  • sergey1294

    569

  • Ugar68

    517

  • Programmer

    419

Top Posters In This Topic

Popular Posts

Ну, в данном случае мне стоило бы сразу соблюдать простейшие приёмы защитного программирования, то есть проверять, не равна ли нулю переменная, оказавшаяся под знаком деления. Ведь она "чужая", то ест

На счёт проверок, это правильно. Я больше очень практикую, то же нарывался. Но в моём случае у меня советник открывал ордер минимальным лотом вместо нормального, когда замечал, доливаться было поздно.

Основной советник выставляет "сигнальный" отложенный ордер далеко от текущей цены и каждую например, минуту модифицирует у него время экспирации: это может быть текущее время плюс 1 час, или плюс 1 су

Posted Images

Mighty Mouse
50 минут назад, Ugar68 сказал:

А что iBarShift это не простое и элегантное решение? Мне кажется это очень удобный инструмент.

 

Спасибо, не знал.

Link to post
Share on other sites
torgf
10.01.2019 в 20:09, Ugar68 сказал:

Написал упрощенный вариант (бюджетный) функции. Не проверял. Разбирайтесь. Справочник в помощь.

Спасибо. Самостоятельно до такого, мне ни кода бы не дойти☺️

Link to post
Share on other sites
torgf

Как можно записать в цикл следующее?

    int coun=2;
    bool bul=false;
     if(coun==1)
       {
      if( iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]) bul=true;
       }
     if(coun==2)
       {
      if(iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]&&
         iAC(NULL,0,3)<iAC(NULL,0,4)&&Open[2]<Close[2])  bul=true;
       }
     if(coun==3)
       {
      if(iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]&&
         iAC(NULL,0,3)<iAC(NULL,0,4)&&Open[2]<Close[2]&&
         iAC(NULL,0,4)<iAC(NULL,0,5)&&Open[3]<Close[3])  bul=true;
       }

чтобы не дописывать условие для coun=4 и т.д.

Link to post
Share on other sites
Ugar68
17 минут назад, torgf сказал:

Как можно записать в цикл следующее?


    int coun=2;
    bool bul=false;
     if(coun==1)
       {
      if( iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]) bul=true;
       }
     if(coun==2)
       {
      if(iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]&&
         iAC(NULL,0,3)<iAC(NULL,0,4)&&Open[2]<Close[2])  bul=true;
       }
     if(coun==3)
       {
      if(iAC(NULL,0,2)<iAC(NULL,0,3)&&Open[1]<Close[1]&&
         iAC(NULL,0,3)<iAC(NULL,0,4)&&Open[2]<Close[2]&&
         iAC(NULL,0,4)<iAC(NULL,0,5)&&Open[3]<Close[3])  bul=true;
       }

чтобы не дописывать условие для coun=4 и т.д.

Надо инвертировать условия. Как то так:

int coun=4, i;
bool bul=true;
for(i=0;i<coun;i++)
   {
   if(iAC(NULL,0,i+2)>=iAC(NULL,0,i+3) || Open[i+1]>=Close[i+1])
      {
      bul=false;
      break;
      }
   }

 

  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
  • 2 weeks later...
Mighty Mouse

Есть ли способ во входящих параметрах советника в одной переменной определить в какую сторону открываться?

Так чтобы в выпадающем списке можно было выбрать только что-то одно Buy или Sell.

Пока что приходится использовать две  переменных:

 

input bool    OpenBuy = true;
input bool    OpenSell = false;

 

 

Edited by Mighty Mouse
Link to post
Share on other sites
Ugar68
1 час назад, Mighty Mouse сказал:

Есть ли способ во входящих параметрах советника в одной переменной определить в какую сторону открываться?

Так чтобы в выпадающем списке можно было выбрать только что-то одно Buy или Sell.

Пока что приходится использовать две  переменных:

 

input bool    OpenBuy = true;
input bool    OpenSell = false;

 

 

Использовать перечисление

enum open_direction(Buy=0,Sell=1);

input open_direction OpenType=0;

Edited by Ugar68
  • Thanks 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Mighty Mouse
24 минуты назад, Ugar68 сказал:

Использовать перечисление

enum open_direction(Buy=0,Sell=1);

input open_direction OpenType=0;

 

Ругается на второй строке

'open_direction' - declaration without type  
 

PS 

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

Edited by Mighty Mouse
Link to post
Share on other sites
Ugar68
21 минуту назад, Mighty Mouse сказал:

 

Ругается на второй строке

'open_direction' - declaration without type 

enum open_direction{Buy=0,Sell=1};
input open_direction OpenType=0;


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Mighty Mouse
2 часа назад, Ugar68 сказал:

enum open_direction{Buy=0,Sell=1};
input open_direction OpenType=0;

 

А можно ли то же самое сделать с тикетами?

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

Как при запуске совы выбрать нужную позицию?

Link to post
Share on other sites
Ugar68
1 час назад, Mighty Mouse сказал:

 

А можно ли то же самое сделать с тикетами?

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

Как при запуске совы выбрать нужную позицию?

Для задания тикетов используется внешняя переменная int или uint.

input uint Ticket=567463578;

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


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
sviter

Здраствуйте! делаю скриншот экрана через функцию:
WindowScreenShot ("Screenshotname.png",1280,720); но оно все сохраняет в папку Files, а мне надо указать путь в другую папку что бы сохрняло! как это сделать?

Link to post
Share on other sites
Ugar68
1 час назад, sviter сказал:

Здраствуйте! делаю скриншот экрана через функцию:
WindowScreenShot ("Screenshotname.png",1280,720); но оно все сохраняет в папку Files, а мне надо указать путь в другую папку что бы сохрняло! как это сделать?

Никак. В целях безопасности функции MQL ограничены песочницей. Для использования путей вне песочниц придётся использовать функции из DLL на других языках.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
sviter

какой путь короткий, ато не могу подобрать? "\\Files\\Screenshotname.PNG" ???

Link to post
Share on other sites
Ugar68
10 часов назад, sviter сказал:

какой путь короткий, ато не могу подобрать? "\\Files\\Screenshotname.PNG" ???

Можно длиннее. Например задать имя файла

Name=StringConcatenate(WindowExpertName(),"\\Screen\\Screenshotname.PNG");

Будет путь с соответствующими подпапками Files\имя программы\Screen\Screenshotname.PNG.

Но за пределы Files без DLL не выйти.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
laxander

Тестирую мультивалютника на MQL5. Столкнулся со странным поведением CopyRates.

Код:

MqlRates bars[1];
datetime yesterday = TimeCurrent() - PeriodSeconds(PERIOD_D1);    

if(CopyRates("EURSGD", PERIOD_D1, yesterday, 1, bars) != 1) {
   Print("    CopyRates of EURSGD failed, no history");      
}  
for (int i = 0; i < ArraySize(bars); i++) {         
   PrintFormat("EURSGD Open: %f Close: %f", bars[i].open, bars[i].close);      
} 

if(CopyRates("EURNOK", PERIOD_D1, yesterday, 1, bars) != 1) {
   Print("    CopyRates of EURNOK failed, no history");      
}  
for (int i = 0; i < ArraySize(bars); i++) {         
   PrintFormat("EURNOK Open: %f Close: %f", bars[i].open, bars[i].close);      
} 

В журнал пишет:

2019.02.12 23:00:50.300	Core 01	2018.01.01 00:00:00   EURSGD Open: 1.194140 Close: 1.201360
2019.02.12 23:00:50.300	Core 01	2018.01.01 00:00:00   EURNOK Open: 1.194140 Close: 1.201360

Т.е. оно копирует данные по символу, на котором запущено тестирование (в данном случае я его запускал на EURUSD), а не по тому, что я явно указываю первым параметром CopyRates. Что за х? Почему?

Самое странное, что еще неделю назад все работало, как надо. Рейты брались те, которые указаны в символе.

Link to post
Share on other sites
sviter

Как сделать разницу между двумя датами??.... То есть к примеру 10.02.19 и к примеру текущую 12.02.19 и что бы выдавало 0 лет, 0 месяцев, 2 дня

Link to post
Share on other sites
AntFX
35 минут назад, sviter сказал:

Как сделать разницу между двумя датами??.... То есть к примеру 10.02.19 и к примеру текущую 12.02.19 и что бы выдавало 0 лет, 0 месяцев, 2 дня

(( TimeCurrent() - date ) / 86400 ) = число дней между датами // 86400 - число секунд внутри любого 1 дня 

Edited by AntFX

1

Link to post
Share on other sites
torgf
23.01.2019 в 06:24, Ugar68 сказал:

Надо инвертировать условия. Как то так:

 

Спасибо. 

Как, в индикаторе,получать сигнал только на открытии бара?
Открылся бар красным цветом, а потом стал зелёным цветом. Нужно сигналить  только если открылся зелёным.

if(iAC(NULL,0,i+1)<iAC(NULL,0,i)){...}

пыталась так 

 if(timeeeS==Time[i])continue;
  timeeeS=Time[i];
if(iAC(NULL,0,i+1)<iAC(NULL,0,i))

и volume<=1 Не работает

Link to post
Share on other sites
AntZ

Здравствуйте. Устанавливаю новостной индикатор *** п.8 ***  в коде ошибка (видно на скрине) , подскажите что не так? Может подскажете хороший проверенный новостной индикатор?

2019-02-14_09-21-30.png

Edited by AntFX
п. 8
Link to post
Share on other sites
AntFX

Не увлекайтесь, пожалуйста, ссылками на "независимые" (в кавычках) ресурсы - на них практически всегда идет реклама конкурентных брокеров, а это строго запрещено правилами форума Альпари.


1

Link to post
Share on other sites
AntZ
3 минуты назад, AntFX сказал:

Не увлекайтесь, пожалуйста, ссылками на "независимые" (в кавычках) ресурсы - на них практически всегда идет реклама конкурентных брокеров, а это строго запрещено правилами форума Альпари.

ок, удаляйте там сообщения, а индикатор посоветуйте

Link to post
Share on other sites
AntFX
8 минут назад, AntZ сказал:

ок, удаляйте там сообщения, а индикатор посоветуйте

Я не спец по новостным индикаторам, может кто-то посоветует.


1

Link to post
Share on other sites
Ugar68
5 часов назад, torgf сказал:

Спасибо. 

Как, в индикаторе,получать сигнал только на открытии бара?
Открылся бар красным цветом, а потом стал зелёным цветом. Нужно сигналить  только если открылся зелёным.


if(iAC(NULL,0,i+1)<iAC(NULL,0,i)){...}

пыталась так 


 if(timeeeS==Time[i])continue;
  timeeeS=Time[i];
if(iAC(NULL,0,i+1)<iAC(NULL,0,i))

и volume<=1 Не работает

АС работает по ценам закрытия баров. На истории все бары уже сформированы. Получается что индикатор на истории нарисует что было в момент закрытия бара, а не открытия. Если надо показания в момент открытия, то и индикаторы должны быть применены, работающие по открытию. Кстати тогда ничего не нужно будет придумывать что бы индикатор не перерисовывался на текущем баре, ведь цена открытия бара не меняется.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites
Ugar68

Поправка: АС строится по медианной цене. Но сути это не меняет.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...