not enough money - страница 5

 
Maksim Neimerik:

Вот та часть кода которая отвечает за выставление ордеров:

Сюда ведь по ошибке можно передать cmd = OP_BUY или cmd = OP_SELL. Для таких случаев в функции должна быть проверка.

Саму проверку на достаточность средств лучше делать так, как указано в справке (ни разу не подводила):

if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134) return;
Также непонятно, почему, если указан неправильный объем, то просто отображается сообщение об ошибке? Логичнее подкорректировать его.
 
Taras Slobodyanik:

а 0 - это ордер с нулевым тикетом


Не встречал нулевого тикета. Даже в тестере тикет - это натуральное число.

Другое дело, что не совсем логично приводить int к bool. Тут без вопросов.

 
Ihor Herasko:

Не встречал нулевого тикета. Даже в тестере тикет - это натуральное число.

Другое дело, что не совсем логично приводить int к bool. Тут без вопросов.


в справке написано: "Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. "

то есть всё что не -1 это номер тикета.

 
Taras Slobodyanik:

в справке написано: "Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. "

то есть всё что не -1 это номер тикета.

Вы хотите сказать что здесь ошибка?:

if(!OrderSend(Symbol(),cmd,NormalizeDouble(Lot,2),priceStep,Slippage,0,0,"",magic,0))
      {
         Print("Error = ",GetLastError(),"  ",cmd,"  ",Lot,"  ",Price);
      }
Если
OrderSend

возвращает -1 то это будет true?

 
Maksim Neimerik:

Вы хотите сказать что здесь ошибка?:

Если

возвращает -1 то это будет true?


OrderSend() возвращает значение типа int, а не bool.

И еще вам выше написали, перед открытием отложки используйте функцию AccountFreeMarginCheck()

 
Vitalii Ananev:

OrderSend() возвращает значение типа int, а не bool.

И еще вам выше написали, перед открытием отложки используйте функцию AccountFreeMarginCheck()

ок

 
Ihor Herasko:

Сюда ведь по ошибке можно передать cmd = OP_BUY или cmd = OP_SELL. Для таких случаев в функции должна быть проверка.

Саму проверку на достаточность средств лучше делать так, как указано в справке (ни разу не подводила):

Также непонятно, почему, если указан неправильный объем, то просто отображается сообщение об ошибке? Логичнее подкорректировать его.
но ведь в
AccountFreeMarginCheck

используется OP_BUY либо OP_SELL, а у меня OP_BUYLIMIT и OP_SELLLIMIT...

 
Maksim Neimerik:
но ведь в

используется OP_BUY либо OP_SELL, а у меня OP_BUYLIMIT и OP_SELLLIMIT...


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

 
Taras Slobodyanik:

в справке написано: "Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. "

то есть всё что не -1 это номер тикета.


Само собой. Но чисто логически номер тикета нулем или отрицательным быть не может. Поэтому все же лучше проверять: 

OrderSend() > 0
 
Maksim Neimerik:

Вы хотите сказать что здесь ошибка?:

if(!OrderSend(Symbol(),cmd,NormalizeDouble(Lot,2),priceStep,Slippage,0,0,"",magic,0))
      {
         Print("Error = ",GetLastError(),"  ",cmd,"  ",Lot,"  ",Price);
      }

Если 

OrderSend

возвращает -1 то это будет true?


Смешались в кучу кони, люди.

Причина обращения: