правильный формат функции OrderSend(Symbol(),OP_BUYSTOP

 

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

Вопрос. Пытаюсь послать отложенный ордер. Выдает 130 ошибку - неправильные стопы. Подскажите, пожалуйста, в чем проблема. Спасибо.

int sym_digits = MarketInfo(Symbol(), MODE_DIGITS);

double loss = NormalizeDouble( Low[1]-(High[1]-Low[1])*Point, sym_digits);
double profit = High[1]+(High[1]-Low[1])*Point;
ticket=OrderSend( Symbol(), OP_BUYSTOP, 1 , High[1], 3, profit, loss, "My order #", 16384, 0, Green);

PS пробовал ставить

double loss = 0;
double profit = 0;

согласно документации - это правильно. Но ошибка все равно та же - 130.

 
Перед этим вызовите RefreshRates();
 
Если SL=0 и TP=0 не помогло, остается одно - попытка выставить отложенный ордер близко к рынку. Попробуйте:
 
int sym_digits = MarketInfo(Symbol(), MODE_DIGITS);
int sym_level = MarketInfo(Symbol(), MODE_STOPLEVEL); //Допустимое расстояние к рынку в pips
int sym_point = MarketInfo(Symbol(), MODE_POINT); //Цена 1 pips

if (High[1]-Ask<sym_level*sym_point) //Проверка возможности установки BUYSTOP
{
Comment("Близко к рынку!!!");
}
else
{
Comment("");
double loss = NormalizeDouble( Low[1]-(High[1]-Low[1])*Point, sym_digits);
double profit = High[1]+(High[1]-Low[1])*Point;
ticket=OrderSend( Symbol(), OP_BUYSTOP, 1 , High[1], 3, profit, loss, "My order #", 16384, 0, Green);
}

Кстати, проверка корректности SL и TP тоже нужна. Для OP_SELLSTOP в условии используется (Bid-Low[1]<sym_level*sym_point).
 
Большое спасибо за ответы. Завтра с утра уже займусь этим.
 
double loss = NormalizeDouble( Low[1]-(High[1]-Low[1])*Point, sym_digits);
double profit = High[1]+(High[1]-Low[1])* Point;
И чему будет у Вас равен loss и profit?
High и Low уже дробные, а вы их ещё на один пипс умножаете, т. е., например, если Low[1] = 1.3, High = 1.31, Point = 0.0001, то loss в Вашем случае будет
1.3 - 1.31 * 0.0001 = 1,299869, что после NormalizeDouble даст 1,2999. Аналогично и с profit,  но только ещё хуще - эту-то переменную Вы не нормализируете!
Наверное Point Вам вообще здесь не нужен.
 
будто заколдованная команда - ничего не помогает (понятно, я что-то не то делаю):

ни RefreshRates()
ни Проверка возможности установки BUYSTOP

написал максимально просто

double loss = Low[1]-(High[1]-Low[1]);
double profit = High[1]+(High[1]-Low[1]);

ticket=OrderSend(Symbol(),OP_BUYSTOP,1,High[1],3,profit,loss,"My order #", 16384, 0,Green);

if(ticket<0)
{
Print("OrderSend failed with error # ", GetLastError());
Print("профит # ",profit);
Print("цена открытия # ",High[1]);
Print("стоп # ",loss);
return(0);
}



******* один из результатов (они все подобны, пробую на 4-часовом графике)
2007.07.26 22:26:44 2006.04.12 14:50 1 GBPUSD,H4: OrderSend failed with error # 130
профит # 1.7666
цена открытия # 1.7572
стоп # 1.7384

даже когда эксперимента ради прибавляю 1 к профиту и , соответственно отнимаю одну от стопа - результат тот же - error # 130 (неверные стопы - ну чем же они неверны?!)

Тестирую на исторических данных - не в реальном времени. Не может быть в этом проблемы? - вдруг "трейдер" не работает с отложенными ордерами на исторических данных?

Спасибо.
 
Так вы местами перепутали profit и лосс - сначала идёт стоп, потом профит
 
meiciuc:
будто заколдованная команда - ничего не помогает (понятно, я что-то не то делаю):

При ошибке выводите еще и текущие Bid и Ask - тогда все поймете. В свете вышенаписанного, очень жаль, что разработчики никак не отреагировали на мое предложение: 'Неприятное поведение тестера в 207-м билде'
 
bstone:
meiciuc:
будто заколдованная команда - ничего не помогает (понятно, я что-то не то делаю):

При ошибке выводите еще и текущие Bid и Ask - тогда все поймете. В свете вышенаписанного, очень жаль, что разработчики никак не отреагировали на мое предложение: 'Неприятное поведение тестера в 207-м билде'


Действительно, полезное предложение по уточнению причины неудачи установки ордера. Ошибка 130 выдаётся не только, когда сами стопы неправильны, но и когда сама цена открытия не соответствует текущим Bid-Ask. Пока приходится обходиться установкой непосредственно перед OrderSend(), Print() с выводом параметров ордера типа:

if (Info)Print("Ask=",Ask," BuyStop: OpenPrice=",OpenPrice," StopLoss=",Sl," TakeProfit=",Tp);
 
При ошибке выводите еще и текущие Bid и Ask - тогда все поймете. В свете вышенаписанного, очень жаль, что разработчики никак не отреагировали на мое предложение: 'Неприятное поведение тестера в 207-м билде'
добавил вот. Теперь все - мысли кончились (может, систему на ПК переставить...).

******* один из результатов (они все подобны, пробую на 4-часовом графике)
2007.07.26 22:26:44 2006.04.12 14:50 1 GBPUSD,H4: OrderSend failed with error # 130
профит # 1.7666
цена открытия # 1.7572
стоп # 1.7384
Bid # 1.7476
Ask # 1.7481
 

Тогда обратите внимание на вот это замечание:

notused писал (а):
Так вы местами перепутали profit и лосс - сначала идёт стоп, потом профит
Причина обращения: