Минимально допустимый уровень стоп-лосса/тейк-профита - страница 2

 

Исправил:

double MinLot=MarketInfo(Symbol(),MODE_MINLOT); - минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); - минимально допустимый уровень стоп-лосса/тейк-профита в валюте котировки
double VStopLossLong=Ask- VMin ; - уровень стоп-лосса
double VTakeProfitLong=Ask+ VMin ; - уровень тейк-профита

int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: min",16381,0,Green); - не выставляется.

Но если использовать как написано выше, то есть использовать StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);

то получается, что выставляется не минимальные уровни.

 
first_may:

Исправил:

double MinLot=MarketInfo(Symbol(),MODE_MINLOT); - минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); - минимально допустимый уровень стоп-лосса/тейк-профита в валюте котировки
double VStopLossLong=Ask- VMin ; - уровень стоп-лосса
double VTakeProfitLong=Ask+ VMin ; - уровень тейк-профита

int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: min",16381,0,Green); - не выставляется.

Но если использовать как написано выше, то есть использовать StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);

то получается, что выставляется не минимальные уровни.


Минимальный уровень:

int init()
{
  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
  if(SL < StopLevel) SL = StopLevel;
  if(TP < StopLevel) TP = StopLevel;
  return(0);
}

Брокеры имеют различные уровни и меняют их в зависимости от ситуаций.

 
borilunad:


Минимальный уровень:



Вот мой полный код:

double StopLoss=0.1; // процент убытка
double TakeProfit=0.1; // процент прибыли
double MinLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL);
double VStopLossLong=Ask*(1-StopLoss/100); // стоп-лосс для лонга
double VTakeProfitLong=Ask*(1+TakeProfit/100); // тейк-профит для лонга
double VStopLossShort=Bid*(1+StopLoss/100); // стоп-лосс для шорта
double VTakeProfitShort=Bid*(1-TakeProfit/100); // тейк-профит для шорта
// проверка на минимальный уровень
if (Ask-VStopLossLong<VMin) VStopLossLong=Ask-VMin;
if (VTakeProfitLong-Ask<VMin) VTakeProfitLong=Ask+VMin;
if (VStopLossShort-Bid<VMin) VStopLossShort=Bid+VMin;
if (Bid-VTakeProfitShort<VMin) VTakeProfitShort=Bid-VMin;
// выставление ордера
int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: Test",16382,0,Green);

Сейчас проверю то, что вы предлагаете.

 
borilunad:


Минимальный уровень:



ТО что вы предлагаете MarketInfo(Symbol(),MODE_STOPLEVEL) это же минимально допустимый уровень стоп-лосса/тейк-профита в пунктах, а надо же это перевести в валюту?
 
first_may:



Вот мой полный код:

double StopLoss=0.1; // процент убытка
double TakeProfit=0.1; // процент прибыли
double MinLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL);
double VStopLossLong=Ask*(1-StopLoss/100); // стоп-лосс для лонга
double VTakeProfitLong=Ask*(1+TakeProfit/100); // тейк-профит для лонга
double VStopLossShort=Bid*(1+StopLoss/100); // стоп-лосс для шорта
double VTakeProfitShort=Bid*(1-TakeProfit/100); // тейк-профит для шорта
// проверка на минимальный уровень
if (Ask-VStopLossLong<VMin) VStopLossLong=Ask-VMin;
if (VTakeProfitLong-Ask<VMin) VTakeProfitLong=Ask+VMin;
if (VStopLossShort-Bid<VMin) VStopLossShort=Bid+VMin;
if (Bid-VTakeProfitShort<VMin) VTakeProfitShort=Bid-VMin;
// выставление ордера
int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: Test",16382,0,Green);

Сейчас проверю то, что вы предлагаете.


Нормализовать:

NormalizeDouble(.........,Digits);
И так каждое значение! Смотрите учебник!
 
first_may:

Здравствуйте, подскажите пожалуйста, как правильно пользоваться минимальным допустимым уровнем стоп-лосса/тейк-профита в пунктах. Я написал следующее:

int MinLot=MarketInfo(Symbol(),MODE_MINLOT); - минимальный размер лота

double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); - минимально допустимый уровень стоп-лосса/тейк-профита в валюте котировки

double VStopLossLong=Ask- VMin ; - уровень стоп-лосса
double VTakeProfitLong=Ask+ VMin ; - уровень тейк-профита

int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: min",16381,0,Green);

Но ордер не выставляется :(. Заранее спасибо.

Ещё вместо Ask Должно быть Bid здесь!
 

Изменил:

double TakeProfit=0.1; // процент прибыли
double MinLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL);
double VStopLossLong=Ask*(1-StopLoss/100); // стоп-лосс для лонга
double VTakeProfitLong=Ask*(1+TakeProfit/100); // тейк-профит для лонга
double VStopLossShort=Bid*(1+StopLoss/100); // стоп-лосс для шорта
double VTakeProfitShort=Bid*(1-TakeProfit/100); // тейк-профит для шорта
// проверка на минимальный уровень
if (Ask-VStopLossLong<VMin) VStopLossLong=Ask-VMin;
if (VTakeProfitLong-Ask<VMin) VTakeProfitLong=Ask+VMin;
if (VStopLossShort-Bid<VMin) VStopLossShort=Bid+VMin;
if (Bid-VTakeProfitShort<VMin) VTakeProfitShort=Bid-VMin;

VStopLossLong=NormalizeDouble(VStopLossLong,MarketInfo(Symbol(),MODE_DIGITS));
VTakeProfitLong=NormalizeDouble(VTakeProfitLong,MarketInfo(Symbol(),MODE_DIGITS));
VStopLossShort=NormalizeDouble(VStopLossShort,MarketInfo(Symbol(),MODE_DIGITS));
VTakeProfitShort=NormalizeDouble(VTakeProfitShort,MarketInfo(Symbol(),MODE_DIGITS));

// выставление ордера
int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: Test",16382,0,Green);

Читаю учебник:
MODE_POINT - Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point
MODE_STOPLEVEL - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

получается, чтобы получить минимальное значение в валюте котировки, надо минимально допустимый уровень стоп-лосса/тейк-профита в пунктах умножить на размер пункта в валюте котировки, что я и сделал.

 
Cmu4:
Ещё вместо Ask Должно быть Bid здесь!
А я считаю, что Ask.
 
first_may:

Изменил:

double TakeProfit=0.1; // процент прибыли
double MinLot=MarketInfo(Symbol(),MODE_MINLOT); // Минимальный размер лота
double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL);
double VStopLossLong=Ask*(1-StopLoss/100); // стоп-лосс для лонга
double VTakeProfitLong=Ask*(1+TakeProfit/100); // тейк-профит для лонга
double VStopLossShort=Bid*(1+StopLoss/100); // стоп-лосс для шорта
double VTakeProfitShort=Bid*(1-TakeProfit/100); // тейк-профит для шорта
// проверка на минимальный уровень
if (Ask-VStopLossLong<VMin) VStopLossLong=Ask-VMin;
if (VTakeProfitLong-Ask<VMin) VTakeProfitLong=Ask+VMin;
if (VStopLossShort-Bid<VMin) VStopLossShort=Bid+VMin;
if (Bid-VTakeProfitShort<VMin) VTakeProfitShort=Bid-VMin;

VStopLossLong=NormalizeDouble(VStopLossLong,MarketInfo(Symbol(),MODE_DIGITS));
VTakeProfitLong=NormalizeDouble(VTakeProfitLong,MarketInfo(Symbol(),MODE_DIGITS));
VStopLossShort=NormalizeDouble(VStopLossShort,MarketInfo(Symbol(),MODE_DIGITS));
VTakeProfitShort=NormalizeDouble(VTakeProfitShort,MarketInfo(Symbol(),MODE_DIGITS));

// выставление ордера
int ticket=OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: Test",16382,0,Green);

Читаю учебник:
MODE_POINT - Размер пункта в валюте котировки. Для текущего инструмента хранится в предопределенной переменной Point
MODE_STOPLEVEL - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

получается, чтобы получить минимальное значение в валюте котировки, надо минимально допустимый уровень стоп-лосса/тейк-профита в пунктах умножить на размер пункта в валюте котировки, что я и сделал.


Вы зря всё вместе решаете. Для MoneyManagement надо сделать сразу со старта блок для расчёта Лота. Смотрите любой эксперт в Сайте!
 
borilunad:

Вы зря всё вместе решаете. Для MoneyManagement надо сделать сразу со старта блок для расчёта Лота. Смотрите любой эксперт в Сайте!


Я согласен, что должен быть Ask, а по поводу все вместе рашаю - это я тут написал так, что бы показать то, как я думаю, то есть логику расчета стоп-лосса и тейк-профита. Но вот он не выставляется хоть убей, а если написать как вы говорите, то есть вместо double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); использовать только double VMin=MarketInfo(Symbol(),MODE_STOPLEVEL);, то он выставляется, только загвоздка в том, что мне кажется что это не минимум :(.
Причина обращения: