OpenPosition() для MQL5 - страница 3

 
Движок форума MQL5 оказался очень догадливым и автоматически дал подсказку, кто "остановит программистов" - _StopFlag.
Документация по MQL5: Предопределенные переменные / _StopFlag
Документация по MQL5: Предопределенные переменные / _StopFlag
  • www.mql5.com
Предопределенные переменные / _StopFlag - Документация по MQL5
 
Renat:

Теоретик детектед.

Практика есть мерило реальности, а не игры теоретиков.

"Некие реализации языка" являются конечным мерилом приемлемости и главным мейнстримом в разработке на протяжении многих лет. В С++ int i=NULL; работает и будет работать без выдачи ошибок до скончания веков ибо никуда не деться от тонны созданного кода.

В MQL5 документации нет никаких указаний использовать NULL неправильно. Но никто не остановит программистов испортить свой код плохими конструкциями.

Не приписывайте нам проблем, которые мы не заявляли и не рекомендовали к использованию. Вы сами придумали проблему и приписали ее нам.

А обосновать?

По поводу скончания веков, - опровергну Вас ещё раз. Вы в курсе, что раньше использовались так называемые trigraph sequences? И что следующая программа на C - валидна (я здесь один trigraph только использовал)?

??=include <stdio.h>

int main(void)
{
  printf("Yes\n");
  return 0;
}

Попытка компиляции без специальных опций (Express Studio 2010):

Z:\5>cl 1.c
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 16.00.30319.01 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

1.c
1.c(1) : error C2059: синтаксическая ошибка: ?

А теперь со специальной опцией:

Z:\5>cl /Zc:trigraphs 1.c
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 16.00.30319.01 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

1.c
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

Z:\5>1.exe
Yes

То же самое будет и с NULL, я же Вам ссылки дал на то, в какую сторону развивают Стандарт C++.

А Вы всё - "теоретик детектед". Выше приведён практический пример рудимента. Коим и NULL в будущем станет. И это - практика, а не теория.

Вы не смогли ничего вразумительного ответить по поводу NULL: где он по смыслу используется не как спец-значение для указателя, которое в нём можно лишь хранить, а не использовать, а как "универсальный 0" в C/C++?

Ещё раз, цитата из общения пользователей MQL5, на которую я отвечал изначально:

Kos:
Разницы никакой. false=NULL=0, это просто привычка:)

Вполне практическая проблема, которую "придумали" пользователи Вашего языка MQL5, не особо искушённые в программировании.

Они придумали, а не я! Я только что это Вам цитатой доказал. Опять теоретик? Или просто не хотите увидеть?

Неважно, что там simpleton написал, главное, - вовремя сказать свою коронную фразу: "С задачей справились успешно", да?

Я уже жду, когда Вы её скажете.

 

Классный пример - снова сами придумали проблему и снова ее приписали нам.

Нет никаких триграфов в MQL5 - чего с NULL макроса то съехали? Еще раз повторю - мы никого не заставляем его неправильно использовать.

По уровню контроля исполнения MQL5 бесконечно впереди обычных C/C++ и не имеет указателей в чистом виде. Поэтому не надо на MQL5 проецировать родовые проблемы C/C++.

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


Я отлично понимаю Ваше желание играться в теорию и кусаться - это же куда легче, чем делать большие, практически значимые проекты и выводить их на рынок. Лично я только за последние 10 лет работы в Метаквотс вывел в свет 6 публичных, крупных и успешных софтверных проектов, непосредственно принимая участие в написании кода.

Практика такова, что вне зависимости от языка, подавляющее большинство кода, написанного на любом языке программирования является в чистом виде мусором. Куча народа готова самообманываться и биться за идеалы, ведя разговоры об "теоретически правильном" языке/контроле/конструкциях. Но приходит толпа программистов, которые пишут код левой задней ногой. И ничего нельзя сделать - самообман от возможностей технологий быстро проходит на практике.

В отличие от теоретиков, не проходивших реальную практику значимых разработок (хотя они считают, что как раз проходили), именно практики производят основной объем работ. Причем на достаточно старых, опасных и не модных языках. Этот бизнес держится на рабочих лошадках, которым нужно "реально ехать, а не шашешками светить".

Для обсуждений радостей C++0x есть соответствующие группы, где Вас поймут и поддержат. Только с ними вряд ли можно создать востребованный и конкурентоспособный продукт - заболтают тему.

 
simpleton:

....

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

С наилучшими. 

 

Уважаемые теоретики-практики, поясните мне,как человеку "не особо искушенному в программировании" в чем "соль"? Да, для меня  привычней и удобней использовать NULL.

В чем моя "проблема", если я при инициализации переменных использую NULL, и это не противоречит концепциям языка MQL5.

 
Renat:

Классный пример - снова сами придумали проблему и снова ее приписали нам.

Нет никаких триграфов в MQL5 - чего с NULL макроса то съехали? Еще раз повторю - мы никого не заставляем его неправильно использовать.

По уровню контроля исполнения MQL5 бесконечно впереди обычных C/C++ и не имеет указателей в чистом виде. Поэтому не надо на MQL5 проецировать родовые проблемы C/C++.

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


Я отлично понимаю Ваше желание играться в теорию и кусаться - это же куда легче, чем делать большие, практически значимые проекты и выводить их на рынок. Лично я только за последние 10 лет работы в Метаквотс вывел в свет 6 публичных, крупных и успешных софтверных проектов, непосредственно принимая участие в написании кода.

Практика такова, что вне зависимости от языка, подавляющее большинство кода, написанного на любом языке программирования является в чистом виде мусором. Куча народа готова самообманываться и биться за идеалы, ведя разговоры об "теоретически правильном" языке/контроле/конструкциях. Но приходит толпа программистов, которые пишут код левой задней ногой. И ничего нельзя сделать - самообман от возможностей технологий быстро проходит на практике.

В отличие от теоретиков, не проходивших реальную практику значимых разработок (хотя они считают, что как раз проходили), именно практики производят основной объем работ. Причем на достаточно старых, опасных и не модных языках. Этот бизнес держится на рабочих лошадках, которым нужно "реально ехать, а не шашешками светить".

Для обсуждений радостей C++0x есть соответствующие группы, где Вас поймут и поддержат. Только с ними вряд ли можно создать востребованный и конкурентоспособный продукт - заболтают тему.

Не придумывал я проблему, а привёл аналогию. И ниоткуда не съезжал. По поводу NULL свои мысли изложил ещё в самом начале.

Я не играюсь в теорию, и ещё в давно продемонстрировал, что Ваши программисты, которые наверняка в том числе влияют на принятие решений по MQL5, недостаточно владеют основными вещами в C++. Практически продемонстрировал. А не теоретически.

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

Только не надо связывать эту мою фразу с NULL, это было замечание по поводу проектов и шашечек. И, чтобы опять не услышать о "съезде с темы", - я по поводу NULL применительно к типу bool своё мнение озвучил.

А вот Вы можете объяснить, зачем в контексте типа bool потребовалось значение NULL, причём, совпадающее с false? Для какой такой цели?

 
Kos:

Уважаемые теоретики-практики, поясните мне,как человеку "не особо искушенному в программировании" в чем "соль"? Да, для меня  привычней и удобней использовать NULL.

В чем моя "проблема", если я при инициализации переменных использую NULL, и это не противоречит концепциям языка MQL5.


Не нужен NULL, когда речь идёт о типе bool. Там только false и true. Всё просто.

Это - не то, чтобы "проблема" в прямом смысле. Чтобы было понятно, можно так поступить:

#define False false
#define FALSE false
#define fALSE false

bool IndicatorF     = False;
bool ExpertAdvisorF = FALSE;
bool ScriptF        = fALSE;

И в индикаторах пользоваться только False вместо false, в советниках - FALSE, а в скриптах - fALSE.

Вот применение NULL в качестве false для типа bool примерно такой же смысл имеет.

 

что то у меня никак не получается выставить позицию с минимальным стоп лоссом

2010.07.24 00:53:49 test (EURUSD,M1) 50
2010.07.24 00:53:49 test (EURUSD,M1) result.ask =0 result.bid =0
2010.07.24 00:53:49 test (EURUSD,M1) request.sl =1.29074 request.tp =1.30124
2010.07.24 00:53:49 test (EURUSD,M1) request.price=1.29124 result.price=0
2010.07.24 00:53:49 test (EURUSD,M1) Ошибка ордер buy - код ошибки: 4756

#include <My_lib.mqh>

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   OpenPosition(_Symbol,ORDER_TYPE_BUY, 0.1,0,1000,0);                         
   Print(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)); // Минимальный SL                         
  }


 в журнал пишет вот это

2010.07.24 00:53:49 Scripts Script test (EURUSD,M1) removed
2010.07.24 00:53:49 Trades '104021' : failed instant buy 0.10 EURUSD at 1.29124 sl: 1.29074 tp: 1.30124 [Invalid stops]
2010.07.24 00:53:49 Scripts Script test (EURUSD,M1) loaded successfully

почему инвалид не понимаю. разница 50. все вроде нормально

//+----------------------------------------------------------------------------+
//|  Версия   : 21.06.2010                                                     |
//|  Описание : Открывает позицию и возвращает её тикет.                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy  - наименование инструмента   (NULL или "" - текущий символ)         |
//|    op  - операция (BUY или SELL)                                           |
//|    lot - лот                                                               |
//|    sl  - уровень стоп                                                      |
//|    tp  - уровень тейк                                                      |
//|    mn  - MagicNumber                                                       |
//+----------------------------------------------------------------------------+
int OpenPosition(string sy, ENUM_ORDER_TYPE op, double lot, double sl=0, double tp=0, int mn=0) {
   MqlTradeRequest trReq;     // Будет использоваться для отсылки торговых запросов
   MqlTradeResult  trRez;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlTick tick;              // Будет использоваться для текущих котировок
//-----------------------------------------------------------------------------+
   if(sy=="" || sy=="0") sy=Symbol(); 
   ResetLastError();
//---переменные ---------------------------------------------------------------+
int    Slippage = 5;                               // Проскальзывание цены
int    Dig   = SymbolInfoInteger(sy,SYMBOL_DIGITS);  // Количество знаков после запятой
double poin  = SymbolInfoDouble(sy,SYMBOL_POINT);    // Значение одного пункта
int    min_SL= SymbolInfoInteger(sy,SYMBOL_TRADE_STOPS_LEVEL); // Минимальный SL

if(sl==0) sl=min_SL; 

// параметры по умолчанию для всех новых торговых запросов
   trReq.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
   trReq.type_time=ORDER_TIME_GTC;                                    // в очереди пока не будет снят
   trReq.type_filling = ORDER_FILLING_AON;                            // тип исполнения ордера - все или ничего
   trReq.deviation=Slippage;                                          // проскальзывание от текущей цены
   trReq.magic = mn;                                                  // Magic Number
   trReq.comment="";                                                  // коментарий
   trReq.symbol = sy;                                                 // символ
   trReq.volume = lot;                                                // количество лотов для торговли
   
//--- Получить текущее значение котировки в структуру типа MqlTick
   if(!SymbolInfoTick(sy,tick))
     {
      Alert("Ошибка получения последних котировок - ошибка:",GetLastError());
      return(0);
     }
   if(op==ORDER_TYPE_BUY) {
      trReq.price = NormalizeDouble(tick.ask, Dig);                   // последняя цена ask
      if(sl==0) trReq.sl=0;
      else      trReq.sl = NormalizeDouble(tick.ask - sl*poin, Dig);  // Stop Loss
      if(tp==0) trReq.tp=0;  
      else      trReq.tp = NormalizeDouble(tick.ask + tp*poin, Dig);  // Take Profit
      trReq.type = ORDER_TYPE_BUY;                                    // ордер на покупку
   }
   if(op==ORDER_TYPE_SELL)  {
      trReq.price = NormalizeDouble(tick.bid, Dig);                   // последняя цена Bid
      if(sl==0)   trReq.sl=0;
      else        trReq.sl = NormalizeDouble(tick.bid + sl*poin, Dig);// Stop Loss
      if(tp==0)   trReq.tp=0;
      else        trReq.tp = NormalizeDouble(tick.bid - tp*poin, Dig);// Take Profit
      trReq.type= ORDER_TYPE_SELL;                                    // ордер на продажу
   }
//--- сбросим код последней ошибки в ноль
   ResetLastError();
//--- отправим запрос
   OrderSend(trReq,trRez);
   // анализируем код возврата торгового сервера
   int answer=trRez.retcode;
   if(answer==10009 || answer==10008) //все ок, ордер принят или выполнен
      {
      //Alert("Ордер "+op+" успешно размещен);
      }
   else  //--- если результат неудачный - попробуем узнать в чем дело
      {
      Print("Ошибка ордер ",(op)? "sell":"buy", " - код ошибки: ",GetLastError()); 
      Print("request.price=",trReq.price," result.price=", trRez.price);
      Print("request.sl =",trReq.sl, " request.tp =",trReq.tp);
      Print("result.ask =",trRez.ask," result.bid =",trRez.bid);
      //--- сообщим о неудачном результате торгового запроса возвратом 0
      return(0);
     } // end else
  return(trRez.order);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Стандартные константы, перечисления и структуры / Коды ошибок и предупреждений - Документация по MQL5
 
а вручную ставиться так близко стоп?
 
maryan.dirtyn:
а вручную ставиться так близко стоп?

вот опытным путем подобрал

2010.07.24 01:19:24 Trades '104021' : failed instant buy 1.00 EURUSD at 1.29104 sl: 1.29036 [No prices]
2010.07.24 01:19:23 Trades '104021' : instant buy 1.00 EURUSD at 1.29104 sl: 1.29036
2010.07.24 01:19:19 Trades '104021' : failed instant buy 1.00 EURUSD at 1.29104 sl: 1.29037 [Invalid stops]

получается что срабатывает при 68, это 50+спред сейчас аск 1.29104 бид 1.29086 

SYMBOL_TRADE_STOPS_LEVEL - Минимальный отступ в пунктах от  текущей цены закрытия для установки Stop ордеров

 

правильно ли я понял, что хотя я покупаю по аску (ордер бай) стоп лосс я должен рассчитывать по биду ?

 

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