Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Исправил:
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);
то получается, что выставляется не минимальные уровни.
Исправил:
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);
то получается, что выставляется не минимальные уровни.
Минимальный уровень:
Брокеры имеют различные уровни и меняют их в зависимости от ситуаций.
Минимальный уровень:
Вот мой полный код:
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);
Сейчас проверю то, что вы предлагаете.
Минимальный уровень:
ТО что вы предлагаете MarketInfo(Symbol(),MODE_STOPLEVEL) это же минимально допустимый уровень стоп-лосса/тейк-профита в пунктах, а надо же это перевести в валюту?
Вот мой полный код:
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);
Сейчас проверю то, что вы предлагаете.
Нормализовать:
И так каждое значение! Смотрите учебник!Здравствуйте, подскажите пожалуйста, как правильно пользоваться минимальным допустимым уровнем стоп-лосса/тейк-профита в пунктах. Я написал следующее:
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);
Но ордер не выставляется :(. Заранее спасибо.
Изменил:
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 - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
получается, чтобы получить минимальное значение в валюте котировки, надо минимально допустимый уровень стоп-лосса/тейк-профита в пунктах умножить на размер пункта в валюте котировки, что я и сделал.
Ещё вместо 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 - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
получается, чтобы получить минимальное значение в валюте котировки, надо минимально допустимый уровень стоп-лосса/тейк-профита в пунктах умножить на размер пункта в валюте котировки, что я и сделал.
Вы зря всё вместе решаете. Для MoneyManagement надо сделать сразу со старта блок для расчёта Лота. Смотрите любой эксперт в Сайте!
Вы зря всё вместе решаете. Для MoneyManagement надо сделать сразу со старта блок для расчёта Лота. Смотрите любой эксперт в Сайте!
Я согласен, что должен быть Ask, а по поводу все вместе рашаю - это я тут написал так, что бы показать то, как я думаю, то есть логику расчета стоп-лосса и тейк-профита. Но вот он не выставляется хоть убей, а если написать как вы говорите, то есть вместо double VMin=MarketInfo(Symbol(),MODE_POINT)*MarketInfo(Symbol(),MODE_STOPLEVEL); использовать только double VMin=MarketInfo(Symbol(),MODE_STOPLEVEL);, то он выставляется, только загвоздка в том, что мне кажется что это не минимум :(.