Опубликован первый учебник по MQL4 - страница 4

 
Scriptong:
Я говорю об устанавливаемых пользователем уровнем профита и стопа при работе с советниками, а вы о закрытии цены
(но ведь OrderSend открывает позу, а не закрывает ее!)
Причем мною был приведен конкретный пример, когда пользователь задает необходимые значения прибыли и убытка, которые при использовании примера учебника приводят к неправильному закрытию.
И так считаю не один я. Из-за чего бы весь этот сыр-бор с delyus разгорелся? Человек понял так, как там и написано.
А именно: захотели мы выставить стоп и профит по 15 пунктов. Для этого к биду прибавляем 15 для выставления профита и
отнимаем 15 для выставления стопа. В результате получим разницу в два спрэда.
То есть я веду к тому, что уровни должны отсчитыватья от цены открытия позы, а не от закрытия.

Хотя может вы имеете в виду, что вам интересен сам проход цены, а не полученные в результате значения прибыли или убытка?
В этом случае все верно. Но рядовых пользователей такой подход будет сбивать с толку. Ведь если ему нужно получить прибыль
или убыток в фиксированное число пунктов, то с использованием примера учебника он получит убыток+спрэд, а прибыль уменьшенную на тот же спрэд.

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

OrderSend действительно открывает позицию. При этом правило остаётся тем же: базовой ценой для расчёта SL и ТР является цена закрытия ордера. И это правильно. Просто потому, что SL и ТР это такие штуки, которые имеют отношение к финансовой операции закрытия ордера (хоть на этапе открытия, хоть если ордер ранее уже открыт).

Обратите внимание, речь идёт о предельно допустимых значениях, которые будут признаны корректными клиентским терминалом и сервером. Если указанные требования соблюдаются, то SL и ТР могут стоять где угодно, хоть симметрично относительно цены открытия, хоть не симметрично (лишь бы не ближе к текущей правильной цене, принятой для закрытия ордера определённого типа, чем на величину MODE_STOPLEVEL пунктов).

 
Опечатку 15.5 исправили.
 
SK. писал (а):

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



OrderSend действительно открывает позицию. При этом правило остаётся тем же: базовой ценой для расчёта SL и ТР является цена закрытия ордера. И это правильно. Просто потому, что SL и ТР это такие штуки, которые имеют отношение к финансовой операции закрытия ордера (хоть на этапе открытия, хоть если ордер ранее уже открыт).

Ок. Раз вам так нравится это понятие "базовая цена", пусть оно будет, хотя нигде в официальных документах я его не встречал.
Только вот причем здесь оно? Когда нужно будет закрыть позу, тогда я и буду руководствоваться ценами Bid для Buy и Ask для Sell. А сейчас то мы только открываем ее.
Предлагаю компромис, если уж вы не хотите принять то, что большинство людей принимают. Было бы неплохо дополнить в указанной главе, что 15 - это проход цены, а не уровень стопа и профита. И в результате получается 13 пунктов профита и 17 - стопа. Это мы с вами понимаем, что так оно и будет, а человек, который только учится такие тонкости сам и сразу понять не в силах.
Вобщем, вам удобнее считать так, а вот мне сразу от Ask. По крайней мере, заказчики не задают лишних вопросов, когда выставляют по 15 пунктов стопа и профита в написанных мною советниках, получая при этом совсем другие значения.
 
Scriptong:
Вобщем, вам удобнее считать так, а вот мне сразу от Ask.

Ну это уже..

Что значит удобно???:) (типа, потерял ключи в кустах, а ищу под фонарём, т.к. тут светлее)

Считать можно хоть от фонаря. Лишь бы торговый приказ соответствовал Требованиям и орграничениям при проведении торговых операций.
Смотрите Учебник по MQL4 Приложения Требования и ограничения при проведении торговых операций .

 
SK. писал (а):


Что значит удобно???:) (типа, потерял ключи в кустах, а ищу под фонарём, т.к. тут светлее)



  И правильно! Смысла искать ключи в темноте не вижу - зря потерянное время. )))

Я просто исхожу из практики применения языка, а не из академических соображений.
В ТЗ заказчик указывает: параметр профит и параметр стоп должны быть 100 пунктов.
 Укажите плз как вы будете считать их. При этом учтите, что нужно, чтобы заказчик при закрытии позы увидел либо +100, либо -100.
Иначе - некорректно выполненное задание. Заказчику ведь по барабану, что там считается базовой ценой.

То есть, заполните пустые места:

extern int TakeProfit = 100;
extern int StopLoss = 100;
 
int start()
{
  bool Sell = False;
  bool Buy = False;
  
  // Расчет для установки флагов Sell и Buy
  //......
  // Конец расчета
 
  if(Buy)
    {
     if(StopLoss < MarketInfo(Symbol(), MODE_STOPLEVEL)+1)
       double SL = 0;
      else
       SL = ???????????????;  
     if(TakeProfit < MarketInfo(Symbol(), MODE_STOPLEVEL)+1)
       double TP = 0;
      else
       TP = ???????????????;
     if(OrderSend(Symbol(), OP_BUY, Lots,  Ask, 10, SL, TP, NULL, 200) < 0)
       Print("Ошибка открытия позиции Buy!")      
      }
 
   if(Sell)
     {
       if(StopLoss < MarketInfo(Symbol(), MODE_STOPLEVEL)+1)
         double SL = 0;
        else
         SL = ???????????????;  
       if(TakeProfit < MarketInfo(Symbol(), MODE_STOPLEVEL)+1)
         double TP = 0;
        else
         TP = ???????????????;
       if(OrderSend(Symbol(), OP_SELL, Lots,  Bid, 10, SL, TP, NULL, 200) < 0)
         Print("Ошибка открытия позиции Sell!")      
       }
 
  }
 

Как об стенку горохом..

Вы ожидаете, что я подставлю в эти пустые места расчёт от цены открытия?:) Дудки!

Вы лучше возьмите свой код, подставьте туда то, что Вам кажется "удобным", а после этого просчитайте как будут исполняться торговые приказы на открытие ордеров, если Ваш незадачливый заказчик поставит (а ведь непременно) вместо 100 и 100, например, 3 и 3 при MODE_STOPLEVEL=2 и MODE_SPRED=2 (обычных условиях Альпари для EURUSD). Получится, что профит пройдёт нормально, а стоплосс уже не пройдёт - терминал выдаст ошибку ( о которой заказчик даже не узнает) и фактически торговый приказ не исполнится.

Вот и придётся объяснять заказчику, что под фонарём светлее.

 
Ок, не буду писать на скорую руку здесь, раз так все серьезно. Вот кусок из рабочей программы:
   double StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   double Spread = MarketInfo(Symbol(), MODE_SPREAD);
 
      ......
 
       if(StopLoss < StopLevel + Spread + 1)
         SL = 0;
        else
         SL = Ask - StopLoss*Point; 
       if(TakeProfit < StopLevel - Spread + 1)
         TP = 0;
        else 
         TP = Ask+TakeProfit*Point;
Придирайтесь, хотя сути спора та ошибка не меняла. Просто покажите, как вы будете рассчитывать профит и стоп, если я такой балбес и делаю все неправильно. Научите!!!

P. S. Я не из тех людей, которые не могут признать свои ошибки. Так что если вы мне опишите как правильно выставлять профит и стоп согласно приведенному мною ТЗ, то охотно признаю, что был неправ. Но пока, кроме разговоров про StopLevel я ничего не услышал.
 

Вы не хотите услышать простую вещь.

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

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

if ( NormalizeDouble(Bid + StopLevel*Point, Digits) > NormalizeDouble(Var,Digits) )
   {
   //...
   }

где Var = значение цены тэйкпрофита на Бае

А внутри фигурных скобок нужно выполнить одно из двух:
- либо обнулить это значение (как в Вашем коде)
- либо увеличить значение Var до величины Bid + StopLevel * Point

Ну, либо отказаться от торгового приказа.

 

Началось с того, что переписал некоторые "старые" скрипты...
Почему тогда использовали MarketInfo(Symbol(),MODE_BID) вместо преопределённой Bid пока загадка,
однако всё вроде работает как надо... Вопрос!
Чем это грозит или всё паралельно?

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

Для каждой выполняющейся MQL4-программы поддерживается ряд предопределенных переменных, которые отражают состояние текущего ценового графика на момент запуска программы - эксперта, скрипта или пользовательского индикатора.

Библиотеки пользуются переменными вызвавшего их модуля.

Для безопасного и быстрого доступа к этим данным клиентский терминал обеспечивает локальные копии предопределенных переменных для каждой запущенной программы отдельно. Эти данные обновляются при каждом новом запуске прикрепленного эксперта или пользовательского индикатора автоматически, либо при помощи вызова функции RefreshRates().
 
a!=b

Расположение ! (знака инверсии, лог. НЕ) имеет значение, т.е. и а! равны с точки зрения синтаксиса?
Существует ли ещё способ проверки условия на то что если a не равно b

Причина обращения: