Изложите четкие правила использования минимального стопуровня - страница 2

 
интересно, почему творцы молчат:-)

Завтра с утра напишем детально. Сегодня тяжелый день был.
 

Бид=1.2700 Аск=1.2703 Спред = 3п и Стоплевел 5п
-----
Если мы хотим открыть Бай:
Кус открытия ордера = Аск = 1.2703
СЛ (наиболее приближённый) = Бид-СтопЛевел = 1.2700 - 0.0005 = 1.2695
ТП (наиболее приближённый) = Бид+СтопЛевел = 1.2700 + 0.0005 = 1.2705


Такой ордер не откроется потому что:
1. Сервер заругается на ТП... ТП ближе чем Стоплевел от цены Аск
2. Необходимо добавлять и отнимать 1 пункт соответственно иначе опять возврат №130... Эта тема уже обсуждалась

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

Завтра с утра напишем детально. Сегодня тяжелый день был.


Ренат ждем с нетерпением!!!
 
Основное правило: стопы можно ставить не ближе MarketInfo(Symbol(),MODE_STOPLEVEL) пунктов.

Вот скрипт для проверки:
#include "..\libraries\stdlib.mq4"
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  { 
   int    ticket;                                         // номер тикета 
   int    digits   =MarketInfo(Symbol(),MODE_DIGITS);     // сохраним количество знаков
   double volume   =MarketInfo(Symbol(),MODE_MINLOT);     // сохраним минимальный лот
   double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);  // сохраним минимальный отступ
//---- покажем настройки
   Print("Минимальный лот: ",volume," минимальный отступ: ",stoplevel);
//---- попробуем открыть позицию по рынку с максимально близко 
//---- установленными StopLoss и TakeProfit, покупаем по аску
//---- показываем, что открываться можно с отступом в stoplevel пунктов
   ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,2,
                    NormalizeDouble(Bid-stoplevel*Point,digits),   // SL
                    NormalizeDouble(Bid+stoplevel*Point,digits));  // TP
   if(ticket<1) 
     {
      Print("Шаг 1: ошибка ",ErrorDescription(GetLastError())); 
      return(-1); 
     }
//---- выделим только что открытый ордер и обновим рыночное окружение
   if(OrderSelect(ticket,SELECT_BY_TICKET)==false)
     {
      Print("Шаг 2: ошибка ",ErrorDescription(GetLastError())); 
      return(-2);
     }
   RefreshRates();  // обновим рыночное окружение
//---- попробуем модифицировать StopLoss, не трогая TakeProfit
//---- отодвинем стоп-лосс на 2 пипса (может и не получиться, если рынок дернется)
//---- показываем, что TakeProfit не проверяется, если он не изменился
   if(OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()-2*Point,OrderTakeProfit(),0)==false)
     {
      Print("Шаг 3: ошибка ",ErrorDescription(GetLastError())); 
      return(-3);
     }
//---- удалим стопы, ничего не показываем, просто подготовка к следующему шагу
   if(OrderModify(ticket,OrderOpenPrice(),0,0,0)==false)
     {
      Print("Шаг 4: ошибка ",ErrorDescription(GetLastError())); 
      return(-4);
     }
   RefreshRates();  // обновим рыночное окружение
//---- попробуем снова выставить стопы вплотную к рынку
//---- показываем, что StopLoss и TakeProfit нормально ставятся
   if(OrderModify(ticket,OrderOpenPrice(),
                  NormalizeDouble(Bid-stoplevel*Point,digits),   // SL
                  NormalizeDouble(Bid+stoplevel*Point,digits),   // TP
                  0)==false)
     {
      Print("Шаг 5: ошибка ",ErrorDescription(GetLastError())); 
      return(-3);
     }
//---- тест закончен
   Print("Тест успешно завершен!");
   return(0);
  }


И его вывод на EURUSD M1:

21:40:48 Минимальный лот: 0.1 минимальный отступ: 3
21:40:51 open #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok
21:40:54 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2687 tp: 1.2695 ok
21:40:56 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 0.0000 tp: 0.0000 ok
21:40:59 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok
21:40:59 Тест успешно завершен!


В этом форуме уже несколько раз поднимался вопрос с формулировкой "почему выдается такая ошибка? у вас ошибка!? куда же ставить стопы?"

Не надо забывать, что попытка установки стопа вплотную к возможному уровню может произойти в момент прихода нового ценового тика на сервере. И это значит, что достаточно часто(именно часто!) сервер будет выдавать ответ ERR_INVALID_STOPS.

То, что сервер сообщает о минимальном отступе никак не означает, что клиенту достаточно написать NormalizeDouble(Bid-stoplevel*Point,digits). Конечные проверки всегда делаются на сервере и сервер вправе отказать, если у него есть новая цена, для которой уровень стопа слишком близко стоит.

Какие есть варианты выхода из ситуации:

1) Ставить стоп на 1 пипс дальше с надеждой, что установка пройдет. Это негарантированный способ, так как всегда есть вероятность, что цена дернется больше чем на 1 пипс, пока заявка идет от клиента до сервера

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

3) Перестать пипсовать и ставить стопы нормально. Близкие стопы в 3 пипсах от рынка - это не трейдинг. Трейдер, торгующий на грани разрешенного, всегда будет рисковать, нарываясь на отказы сервера. И чем чаще он будет пытаться совершать торговые транзакции в желании еще чуть чуть пододвинуть уровень, тем большее проблем в исполнении он будет иметь.

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

 

Бид=1.2700 Аск=1.2703 Спред = 3п и Стоплевел 5п
-----
Если мы хотим открыть Бай:
Кус открытия ордера = Аск = 1.2703
СЛ (наиболее приближённый) = Бид-СтопЛевел = 1.2700 - 0.0005 = 1.2695
ТП (наиболее приближённый) = Бид+СтопЛевел = 1.2700 + 0.0005 = 1.2705


Такой ордер не откроется потому что:
1. Сервер заругается на ТП... ТП ближе чем Стоплевел от цены Аск
2. Необходимо добавлять и отнимать 1 пункт соответственно иначе опять возврат №130... Эта тема уже обсуждалась

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

Не заругается. Я указал почему (т.е. просто в соответствии со здравым смыслом):
Все баи открываются по Аску - хоть явные, хоть отложенные. Поэтому расчёт открытий от Аска.
Все баи закрываются по Биду - хоть стопом, хоть профитом. Поэтому расчёт для них от Бида.


То же в примере Рената:
21:40:51 open #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok



Аск = 1.2695, т.е. Бид = 1.2692
А дальше - расчёт от Бида:

СЛ (наиболее приближённый) = Бид-СтопЛевел
ТП (наиболее приближённый) = Бид+СтопЛевел

СЛ = 1.2692 - 0.0003 = 1.2689
ТП = 1.2692 + 0.0003 = 1.2695

 
Уважаемый Ренат, вопрос касался, скажем так, правил технической эксплуатации системы.
 
Уважаемый Ренат, вопрос касался, скажем так, правил технической эксплуатации системы.

Я постарался раскрыть вопрос.

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

Бид=1.2700 Аск=1.2703 Спред = 3п и Стоплевел 5п
-----
Если мы хотим открыть Бай:
Кус открытия ордера = Аск = 1.2703
СЛ (наиболее приближённый) = Бид-СтопЛевел = 1.2700 - 0.0005 = 1.2695
ТП (наиболее приближённый) = Бид+СтопЛевел = 1.2700 + 0.0005 = 1.2705


Такой ордер не откроется потому что:
1. Сервер заругается на ТП... ТП ближе чем Стоплевел от цены Аск
2. Необходимо добавлять и отнимать 1 пункт соответственно иначе опять возврат №130... Эта тема уже обсуждалась

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

Не заругается. Я указал почему (т.е. просто в соответствии со здравым смыслом):
Все баи открываются по Аску - хоть явные, хоть отложенные. Поэтому расчёт открытий от Аска.
Все баи закрываются по Биду - хоть стопом, хоть профитом. Поэтому расчёт для них от Бида.


То же в примере Рената:
21:40:51 open #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok



Аск = 1.2695, т.е. Бид = 1.2692
А дальше - расчёт от Бида:

СЛ (наиболее приближённый) = Бид-СтопЛевел
ТП (наиболее приближённый) = Бид+СтопЛевел

СЛ = 1.2692 - 0.0003 = 1.2689
ТП = 1.2692 + 0.0003 = 1.2695



Сейчас все перепроверю... Если ошибся - буду долго посыпать голову пеплом :))))
 
Проверьте, конечно.
Пол года назад я написал 18 функций, контролирующих перемещение стопов, профитов и отл.ордеров в сопредельной зоне. Все они работают на основании изложенных правил. (18 = 6 типов ордеров х 3 характеристики - СЛ,ТП,ОП оп=OpenPrice)
Вы можете помотреть их здесь "MQL4: Графический эксперт AutoGraf"
Названия такие:
AG_Rev_SS_SL_scr.mq4 SS=SellStop, SL=StopLoss.
AG_Rev_BL_TP_scr.mq4 BL = BuyLimit, TP=TakeProfit
и т.д.
 
Основное правило: стопы можно ставить не ближе MarketInfo(Symbol(),MODE_STOPLEVEL) пунктов.

Вот скрипт для проверки:
#include "..\libraries\stdlib.mq4"
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  { 
   int    ticket;                                         // номер тикета 
   int    digits   =MarketInfo(Symbol(),MODE_DIGITS);     // сохраним количество знаков
   double volume   =MarketInfo(Symbol(),MODE_MINLOT);     // сохраним минимальный лот
   double stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);  // сохраним минимальный отступ
//---- покажем настройки
   Print("Минимальный лот: ",volume," минимальный отступ: ",stoplevel);
//---- попробуем открыть позицию по рынку с максимально близко 
//---- установленными StopLoss и TakeProfit, покупаем по аску
//---- показываем, что открываться можно с отступом в stoplevel пунктов
   ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,2,
                    NormalizeDouble(Bid-stoplevel*Point,digits),   // SL
                    NormalizeDouble(Bid+stoplevel*Point,digits));  // TP
   if(ticket<1) 
     {
      Print("Шаг 1: ошибка ",ErrorDescription(GetLastError())); 
      return(-1); 
     }
//---- выделим только что открытый ордер и обновим рыночное окружение
   if(OrderSelect(ticket,SELECT_BY_TICKET)==false)
     {
      Print("Шаг 2: ошибка ",ErrorDescription(GetLastError())); 
      return(-2);
     }
   RefreshRates();  // обновим рыночное окружение
//---- попробуем модифицировать StopLoss, не трогая TakeProfit
//---- отодвинем стоп-лосс на 2 пипса (может и не получиться, если рынок дернется)
//---- показываем, что TakeProfit не проверяется, если он не изменился
   if(OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()-2*Point,OrderTakeProfit(),0)==false)
     {
      Print("Шаг 3: ошибка ",ErrorDescription(GetLastError())); 
      return(-3);
     }
//---- удалим стопы, ничего не показываем, просто подготовка к следующему шагу
   if(OrderModify(ticket,OrderOpenPrice(),0,0,0)==false)
     {
      Print("Шаг 4: ошибка ",ErrorDescription(GetLastError())); 
      return(-4);
     }
   RefreshRates();  // обновим рыночное окружение
//---- попробуем снова выставить стопы вплотную к рынку
//---- показываем, что StopLoss и TakeProfit нормально ставятся
   if(OrderModify(ticket,OrderOpenPrice(),
                  NormalizeDouble(Bid-stoplevel*Point,digits),   // SL
                  NormalizeDouble(Bid+stoplevel*Point,digits),   // TP
                  0)==false)
     {
      Print("Шаг 5: ошибка ",ErrorDescription(GetLastError())); 
      return(-3);
     }
//---- тест закончен
   Print("Тест успешно завершен!");
   return(0);
  }


И его вывод на EURUSD M1:

21:40:48 Минимальный лот: 0.1 минимальный отступ: 3
21:40:51 open #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok
21:40:54 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2687 tp: 1.2695 ok
21:40:56 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 0.0000 tp: 0.0000 ok
21:40:59 modify #4010311 buy 0.10 EURUSD at 1.2695 sl: 1.2689 tp: 1.2695 ok
21:40:59 Тест успешно завершен!


В этом форуме уже несколько раз поднимался вопрос с формулировкой "почему выдается такая ошибка? у вас ошибка!? куда же ставить стопы?"

Не надо забывать, что попытка установки стопа вплотную к возможному уровню может произойти в момент прихода нового ценового тика на сервере. И это значит, что достаточно часто(именно часто!) сервер будет выдавать ответ ERR_INVALID_STOPS.

То, что сервер сообщает о минимальном отступе никак не означает, что клиенту достаточно написать NormalizeDouble(Bid-stoplevel*Point,digits). Конечные проверки всегда делаются на сервере и сервер вправе отказать, если у него есть новая цена, для которой уровень стопа слишком близко стоит.

Какие есть варианты выхода из ситуации:

1) Ставить стоп на 1 пипс дальше с надеждой, что установка пройдет. Это негарантированный способ, так как всегда есть вероятность, что цена дернется больше чем на 1 пипс, пока заявка идет от клиента до сервера

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

3) Перестать пипсовать и ставить стопы нормально. Близкие стопы в 3 пипсах от рынка - это не трейдинг. Трейдер, торгующий на грани разрешенного, всегда будет рисковать, нарываясь на отказы сервера. И чем чаще он будет пытаться совершать торговые транзакции в желании еще чуть чуть пододвинуть уровень, тем большее проблем в исполнении он будет иметь.

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



Уважаемый Ренат! Ваш скрипт выдает ошибку при тестировании минимального отступа на демосервере Альпари

2006.07.17 14:25:15 zzz USDCHF,M15: loaded successfully
2006.07.17 14:25:15 zzz USDCHF,M15: Минимальный лот: 0.1 минимальный отступ: 5
2006.07.17 14:25:15 zzz USDCHF,M15: Шаг 1: ошибка invalid stops

Где ошибка в скрипте или в настройках сервера?