Спрашивайте! - страница 64

 
ryanklefas:
Я думаю, что функция normalizeDouble тоже подойдет. Я также видел код, использующий функции MathFloor и MathCeiling для достижения того же самого.

Итак, вы хотите сказать, что расчет должен работать так, как я закодировал его в разделе "Начало переменной", как указано ниже:

double LotSize = NormalizeDouble(Lot_Size_Ratio*((AccountBalance()/1000)), 3);

Тогда, возможно, моя проблема в другом месте, потому что когда я задаю следующее:

extern bool LotSizeManager = True;

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

 
waaustin:
double LotSize = NormalizeDouble(Lot_Size_Ratio*((AccountBalance()/1000)), 3);

double LotSize = NormalizeDouble(Lot_Size_Ratio*((AccountBalance()/1000)), 1); // 0: фуллоты, 1: минилоты, 2: микролоты, 3: никогда не используется

 
Michel:
double LotSize = NormalizeDouble(Lot_Size_Ratio*((AccountBalance()/1000)), 1); // 0: фуллоты, 1: минилоты, 2: микролоты, 3: никогда не используется

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

 
waaustin:
То есть вы хотите сказать, что это зависит от того, какой точности я хочу размер лота. Если мне нужна точность в микролот, например, 0.75 лота, то я бы использовал значение 2.

Да, вы поняли!

Но убедитесь, что микролоты (2 десятичных знака) подходят для вашего брокера и типа вашего счета.

Я не очень хорошо знаю, как IBFX работает с мини-счетом, т.е. если микролоты на мини-счетах также называются минилотами и имеют только 1 десятичную дробь. Может быть, кто-то, кто использует IBFX, может ответить здесь?

Тем не менее, лучше всего спросить у вашего брокера.

 
Michel:
Да, вы поняли!

Но убедитесь, что микролоты (2 десятичных знака) подходят для вашего брокера и типа вашего счета.

Я не очень хорошо знаю, как IBFX работает с мини-счетом, т.е. если микролоты на мини-счетах также называются минилотами и имеют только 1 десятичную дробь. Может быть, кто-нибудь, кто использует IBFX, может ответить здесь?

Тем не менее, лучше всего спросить у вашего брокера.

Большое спасибо. Код LotSizing, кажется, работает нормально. Однако, похоже, что у меня есть еще одна ошибка в коде, и я не могу ее понять.

У меня советник загружен на более чем одной паре, он размещает сделки только на одной паре. Код LotSizing работает нормально. Но он больше не размещает сделки на других валютных парах. Однако, когда я устанавливаю следующее значение:

extern bool LotSizeManager = False;

советник размещает сделки для каждой валютной пары, к которой я привязал советника.

 
waaustin:
Большое спасибо. Код LotSizing вроде бы работает нормально. Однако, похоже, что где-то в коде есть еще одна ошибка, и я не могу ее понять.

У меня советник загружен на более чем одной паре, он размещает сделки только на одной паре. Код LotSizing работает нормально. Но он больше не размещает сделки на других валютных парах. Однако, когда я устанавливаю следующее значение:

extern bool LotSizeManager = False;

Советник размещает сделки для каждой валютной пары, к которой я привязал советника.

Never Mind. Я понял, где проблема! Спасибо за помощь.

 

Проблема: В заданное пользователем время советник пытается разместить отложенный ордер, но текущая цена слишком близка, чтобы брокер принял ордер.

Вопрос: Как мне закодировать цикл, который будет проверять iOpen на 1-минутном баре каждую минуту, пока советник не примет ордер? Просто не уверен, как включить проверку каждую минуту, пока ордер не будет введен. Кажется, что текущий код забывает, что он ищет через несколько минут, потому что как только цена уходит с пути входа, ничего не происходит.

Я думаю, что частично это выглядит следующим образом:

double Open_Price_Every_Minute;

Open_Price_Every_Minute = iOpen(NULL,PERIOD_M1,0);

Open_Price_Every_Minute = NormalizeDouble(Open_Price_Every_Minute, Digits);

if (Allow_LimitOrder_for_Entry_A==false)

{

OrderSend(Symbol(), OP_BUYSTOP, Lots, LA, Slippage, LASL, LATP, "", Magic, 0, FireBrick);

OrderSend(Symbol(), OP_SELLSTOP, Lots, SA, Slippage, SASL, SATP, "", Magic, 0, FireBrick);

}

Как всегда, спасибо за помощь и уделенное время.

Джеймс

 
proverbs:
Похоже, что текущий код забывает, что он ищет, через несколько минут, потому что как только цена уходит с пути входа, ничего не происходит.

Я не думаю, что вы захотите, чтобы в советнике цикл работал бесконечно. Я никогда не пробовал, но не думаю, что это будет хорошо. Если вы хотите, чтобы советник "помнил", что он делал, храните все данные, которые вам нужно помнить, как статические переменные (переменные, объявленные вне главной функции) или как глобальные переменные MT4.

 
ryanklefas:
Я не думаю, что вы захотите, чтобы в советнике цикл выполнялся бесконечно. Я никогда не пробовал, но не думаю, что это будет хорошо. Если вы хотите, чтобы советник "помнил", что он делал, храните все данные, которые вам нужно помнить, как статические переменные (переменные, объявленные вне главной функции) или как глобальные переменные MT4.

Привет!

Помещение ea-процессинга в цикл - хороший способ, прочитайте это:

https://www.mql5.com/en/articles/1462

Вам просто нужно сделать это правильным образом.

 

Калензо,

Спасибо за статью. Похоже, я скоро узнаю больше, чем просил.