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

 
borilunad:

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



Вот я например написал

// проверка на минимальный уровень
if (Ask-VStopLossLong<VMin) VStopLossLong=Ask-VMin-10*MarketInfo(Symbol(),MODE_POINT);

то есть вычел еще 10 единци и ордер выставился!!!

 
first_may:


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

СЛ и ТП долхны быть целыми, а потом умножаешь на Point! Разбирайтесь, когда в голове каша, "убей" не поможет!
 
first_may:


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

khorosh, first_may вы не правы насчёт Ask.

Вот ссылка, почитайте оба ещё раз учебник (там внизу даже есть пример выставления ордера BUY): https://docs.mql4.com/ru/trading/ordersend

Рабочий код с первого поста выглядит так:

double MinLot=MarketInfo(Symbol(),MODE_MINLOT);

double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); 

double VStopLossLong=Bid- VMin ;

double VTakeProfitLong=Ask+ VMin ;

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

СЛ и ТП долхны быть целыми, а потом умножаешь на Point! Разбирайтесь, когда в голове каша, "убей" не поможет!


СЛ и ТП долхны быть целыми - понятно, возможно в этом ошибка.

А как же тогда посчитать 1% прибыли/убытка от точки входа? Допустим Ask=202,24, тогда можно рассчитать VStopLossLong=202,24*(1-1/100)=200,22, а VTakeProfitLong=202,24*(1+1/100)=200,44. Мне надо их как то сделать целыми, что бы потом умножить на Point=0.0.1. Так что ли: VStopLossLong=202,24*(1-1/100)*100* Point =200,22 ?

 
Cmu4:

khorosh, first_may вы не правы насчёт Ask.

Вот ссылка, почитайте ещё раз учебник (там внизу даже есть пример выставления ордера BUY): https://docs.mql4.com/ru/trading/ordersend

Рабочий код с первого поста выглядит так:

Я не считаю что, если ставить бид, то это будет фатальная ошибка. Но всё таки правильнее будет аск. Чтобы сделать вывод как лучше, рассчитайте чему будет равен убыток в пунктах при срабатывании стоплосса, для вариатов аск и бид и тогда можно сделать вывод. Я это уже неоднократно объяснял на форуме, поэтому предлагаю это проверить вам.

 
first_may:


СЛ и ТП долхны быть целыми - понятно, возможно в этом ошибка.

А как же тогда посчитать 1% прибыли/убытка от точки входа? Допустим Ask=202,24, тогда можно рассчитать VStopLossLong=202,24*(1-1/100)=200,22, а VTakeProfitLong=202,24*(1+1/100)=200,44. Мне надо их как то сделать целыми, что бы потом умножить на Point=0.0.1. Так что ли: VStopLossLong=202,24*(1-1/100)*100* Point =200,22 ?


% надо рассчитывать не от Аsk, а от AccountFreeMargin()! Cмотрите Учебник, Документацию и в КодеБэйс эксперты! Вперёд!
 

После нашей дискуссии получилось вот что:

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=Bid*(1-StopLoss/100); // стоп-лосс для лонга
double VTakeProfitLong=Ask*(1+TakeProfit/100); // тейк-профит для лонга
double VStopLossShort=Ask*(1+StopLoss/100); // стоп-лосс для шорта
double VTakeProfitShort=Bid*(1-TakeProfit/100); // тейк-профит для шорта

// проверка на минимальный уровень
if (Bid-VStopLossLong<VMin) VStopLossLong=Bid-VMin;
if (VTakeProfitLong-Ask<VMin) VTakeProfitLong=Ask+VMin;
if (VStopLossShort-Ask<VMin) VStopLossShort=Ask+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));

OrderSend(Symbol(),OP_BUY,MinLot,Ask,0,VStopLossLong,VTakeProfitLong,"BUY: Test",16382,0,Green);

Вроде теперь выставляется.

 
borilunad:

% надо рассчитывать не от Аsk, а от AccountFreeMargin()! Cмотрите Учебник, Документы и в КодеБэйс эксперты! Вперёд!


Я имел введу что закрыть позицию при достижении уровня прибыли в 1%.
 
first_may:


Я имел введу что закрыть позицию при достижении уровня прибыли в 1%.

1% от свободной маржи, пользуясь SRC:
if(AccountTakeProfit >= AccountFreeMargin*0.01)
{
  CloseOrder(OrderTicket(),OrderLots(),BID);
  return(0);
}  
Причина обращения: