Invalid Stops

 
Здравствуйте. Не понимаю, сколько уже не изменял все, что можно. Почему возникают эти ошибки? Всё уже правил, и по-разному цены заявлял, никак. Всегда одно и тоже. И выставлял через значение Ask, и через mrate[0].close, и через переменную BuyPrice, полученную через Ask. 
	      double BuyPrice=NormalizeDouble(mysymbol.Ask(),_Digits);               //--- последняя цена ask
            double stloss = NormalizePrice(_Symbol,mysymbol.Ask() - SL*_Point); //--- Stop Loss
            double profit = NormalizePrice(_Symbol,mysymbol.Ask() + TP*_Point);
            if(mytrade.Buy(Lot,_Symbol,BuyPrice,stloss,profit)) 
               {
                  Alert("Ордер на покупку был успешно размещен, Ticket#:",mytrade.ResultOrder(),"!!");
                  priceEnter = BuyPrice;
                  lastCloseComm = "";
                  slLevel = stloss;
               }
            else
               {
                  Alert("Ордер на покупку объема:",mytrade.RequestVolume(), 
                        ", sl:", mytrade.RequestSL(),
                        ", цена:", mytrade.RequestPrice(), 
                        " не выполнен -ошибка:",mytrade.ResultRetcodeDescription());
                          return;
               }

 
Fresto:
Здравствуйте. Не понимаю, сколько уже не изменял все, что можно. Почему возникают эти ошибки? Всё уже правил, и по-разному цены заявлял, никак. Всегда одно и тоже. И выставлял через значение Ask, и через mrate[0].close, и через переменную BuyPrice, полученную через Ask. 


А не пробовали сначала открыть позицию без SL и TP, а потом ее модифицировать и установить нужный SL и TP.
 
Vitalii Ananev:

А не пробовали сначала открыть позицию без SL и TP, а потом ее модифицировать и установить нужный SL и TP.

Нет, не пробовал, но ведь должно работать в идеале и так, в самом запросе есть и установка sl и tp. 
 
Fresto:

Нет, не пробовал, но ведь должно работать в идеале и так, в самом запросе есть и установка sl и tp. 

Попробуйте.
 
Не всегда он выставляет. Всё равно. Попробовал. 

P.s. либо меня программа явно троллит. Когда ведь срабатывает SL или TP, то выставляется ордер в противоположную сторону. Вчера когда срабатывал SL у меня явно были 4 события OnTradeTransaction. Сейчас когда срабатывает SL, выходит только событие Request. Стопы не выставляются, пытался как угодно уже прописывать, это в чем может быть дело? 
 
Fresto:
Здравствуйте. Не понимаю, сколько уже не изменял все, что можно. Почему возникают эти ошибки? Всё уже правил, и по-разному цены заявлял, никак. Всегда одно и тоже. И выставлял через значение Ask, и через mrate[0].close, и через переменную BuyPrice, полученную через Ask. 


  1. Для объекта mysymbol перед торговым запросом обновляете цены (метод RefreshRates()), а если обновляете контролируете результат (true or false)? Контролируете, что именно Вы получили (контроль на отсутствие цен "0.0")?
  2. Стоп Лосс и тейк профит нужно получать через метод NormalizePrice - так будет автоматически учитываться квантование по символу.
  3. С чего это вдруг для BUY вы при расчёте SL и TP ведёте отчёт от цены ASK? TP и SL для позиции BUY - это цены по которым будет закрыта позиция BUY, а значит это будет цена BID.
 
Vladimir Karputov:

  1. Для объекта mysymbol перед торговым запросом обновляете цены (метод RefreshRates()), а если обновляете контролируете результат (true or false)? Контролируете, что именно Вы получили (контроль на отсутствие цен "0.0")?
  2. Стоп Лосс и тейк профит нужно получать через метод NormalizePrice - так будет автоматически учитываться квантование по символу.
  3. С чего это вдруг для BUY вы при расчёте SL и TP ведёте отчёт от цены ASK? TP и SL для позиции BUY - это цены по которым будет закрыта позиция BUY, а значит это будет цена BID.


Так, всё получилось, когда я изменил Ask на Bid. Просто почему? Я ведь указываю просто цену. Образно говоря.
1. Я покупаю по цене Ask - 11000. Bid сейчас - 10990.

2. Как я понимал раньше в другой программе, там не было Bid и Ask и я просто ставил стоп как число. Закрытие свечи +- значение.

3. Поэтому я и беру цену покупки ( или цену закрытия свечи на данный момент времени ) и от нее вычитаю вниз значение, получаю SL, прибавлю вверх значение, получаю TP.

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


P.s. с первыми двумя пунктами я делал всё правильно.

 
Fresto:


Так, всё получилось, когда я изменил Ask на Bid. Просто почему? Я ведь указываю просто цену. Образно говоря.
1. Я покупаю по цене Ask - 11000. Bid сейчас - 10990.

2. Как я понимал раньше в другой программе, там не было Bid и Ask и я просто ставил стоп как число. Закрытие свечи +- значение.

3. Поэтому я и беру цену покупки и от нее вычитаю вниз значение, получаю SL, прибавлю вверх значение, получаю TP.

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


P.s. с первыми двумя пунктами я делал всё правильно.


Пункт 2: неправильно. Вам нужно применять метод CSymbolInfo::NormalizePrice, а Вы применяете (вообще не пойму, что Вы там применяете).

И уточните свой вопрос.

 
Vladimir Karputov:


Пункт 2: неправильно. Вам нужно применять метод CSymbolInfo::NormalizePrice, а Вы применяете (вообще не пойму, что Вы там применяете).

И уточните свой вопрос.


А, на счет Пункта 2, на форуме кто-то выложил данную функцию, вот и записал, не знал, что она уже реализована в классе. 
double NormalizePrice(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   if(ts==0)return(value);
   return(NormalizeDouble(value/ts,0)*ts);
  }
А про вопрос.
Я всегда в голове понимал, что у тебя есть цена покупки Ask. И есть стоп и тейк профит, как просто цены выше и ниже цены покупки. Поэтому эти цены можно прописывать вручную как захочешь:
1. Цена покупки (ask) +- какое-то значение.
2. Если цена покупки всегда равна открытию свечи, то mrate[0].open +- какое-то значение.
3. Или m_position.PriceOpen() +- какое-то значение.

Это правильные высказывания? 
 
Fresto:


Так, всё получилось, когда я изменил Ask на Bid. Просто почему? Я ведь указываю просто цену. Образно говоря.
1. Я покупаю по цене Ask - 11000. Bid сейчас - 10990.

2. Как я понимал раньше в другой программе, там не было Bid и Ask и я просто ставил стоп как число. Закрытие свечи +- значение.

3. Поэтому я и беру цену покупки ( или цену закрытия свечи на данный момент времени ) и от нее вычитаю вниз значение, получаю SL, прибавлю вверх значение, получаю TP.

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


P.s. с первыми двумя пунктами я делал всё правильно.


Есть такое понятие как минимальный уровень стопов, Разница между текущей ценой и уровнем стопа  не должна быть меньше этого значения, запросить данное значение можно через функцию

SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL);

...

 
Sergey Gritsay:


Есть такое понятие как минимальный уровень стопов, Разница между текущей ценой и уровнем стопа  не должна быть меньше этого значения, запросить данное значение можно через функцию

...


Я проверял эту тему тоже. Я выставляю больше, чем минимальный уровень стопов.