Советники: Diff_TF_MA_EA - страница 3

 
Rashid Umarov:
Коды обновлены.

Видимо, это какая-то своя школа, когда пишут так

   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      ulong ticket=PositionGetTicket(i);
      if(ticket==0) continue;
      if(PositionGetInteger(POSITION_MAGIC)!=InpMagic)   continue;
      if(PositionGetString(POSITION_SYMBOL)!=symb)       continue;
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(type==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else if(type==POSITION_TYPE_SELL)
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
     }
Почему не так?
  for(int i=PositionsTotal()-1; i>=0; i--)
    if (PositionGetTicket(i) &&
        (PositionGetInteger(POSITION_MAGIC)==InpMagic) &&
        (PositionGetString(POSITION_SYMBOL)==symb))  
    {
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
    }


ЗЫ

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)
 
fxsaber:

Видимо, это какая-то своя школа, когда пишут так

Почему не так?
Может потому, что коды нужны в базе не для логических вывертов и стократной вложенности, а для понимания начинающими?
 
fxsaber:
...

ЗЫ

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)

А разница? Не глядел код - это там такая опечатка, или это ваш вопрос?

 
Artyom Trishkin:
Может потому, что коды нужны в базе не для логических вывертов и стократной вложенности, а для понимания начинающими?

Где выверт? Если позиция удовлетворяет условиям, работаем с ней. continue - выверт.

 
Artyom Trishkin:

А разница? Не глядел код - это там такая опечатка, или это ваш вопрос?

//+------------------------------------------------------------------+
//| Возвращает корректный StopLoss относительно StopLevel            |
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     
 
fxsaber:

Где выверт? Если позиция удовлетворяет условиям, работаем с ней. continue - выверт.

А-а-а... Так это же сугубо чьи-то предпочтения.

Например, коды Игоря Кима имеют такую вложенность. Такой код моно писать компактнее (странно, что вы, с вашей привязанностью к лаконичности, предлагаете многократную вложенность блоков кода, которой можно легко избежать, очистив при этом код, и сделав его более наглядным):

Вы предлагаете такую логику:

  • Проверяем условие 1, оно подходит
    • Проверяем условие 2, оно подходит
      • Проверяем условие 3, оно подходит
        • Проверяем условие 4, оно подходит
          • Работаем
        • Конец блока проверки условия 4
      • Конец блока проверки условия 3
    • Конец блока проверки условия 2
  • Конец блока проверки условия 1

А можно и так:

  • условие 1 не подходит - не нужно
  • условие 2 не подходит - не нужно
  • условие 3 не подходит - не нужно
  • условие 4 не подходит - не нужно
  • условия все подходят - работаем

Второй код наглядней и короче

 

fxsaber:

//+------------------------------------------------------------------+
//| Возвращает корректный StopLoss относительно StopLevel            |
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     

А что не так? Ну видать решили исправить чтобы вопросов как у вас ранее были не возникало.

Но теперь, если кто-то решит доработать советник под работу с отложенными ордерами, ему придётся взад-обратно поменять, так как будет ошибка во входном перечислении.

А ORDER_TYPE_BUY == POSITION_TYPE_BUY и ORDER_TYPE_SELL == POSITION_TYPE_SELL - 0 и 1. Поэтому разницы нет. Но входной ENUM_ORDER_TYPE позволяет проще доработать под другие типы ордеров.

 
Artyom Trishkin:

А-а-а... Так это же сугубо чьи-то предпочтения.

Например, коды Игоря Кима имеют такую вложенность. Такой код моно писать компактнее (странно, что вы, с вашей привязанностью к лаконичности, предлагаете многократную вложенность блоков кода, которой можно легко избежать, очистив при этом код, и сделав его более наглядным):

Вы предлагаете такую логику:

  • Проверяем условие 1, оно подходит
    • Проверяем условие 2, оно подходит
      • Проверяем условие 3, оно подходит
        • Проверяем условие 4, оно подходит
          • Работаем
        • Конец блока проверки условия 4
      • Конец блока проверки условия 3
    • Конец блока проверки условия 2
  • Конец блока проверки условия 1

Ничего подобного не показывал. Ким был вынужден делать так из-за отсутствия директивы strict на тот момент.

Предложил именно такой вариант:

А можно и так:

  • условие 1 не подходит - не нужно
  • условие 2 не подходит - не нужно
  • условие 3 не подходит - не нужно
  • условие 4 не подходит - не нужно
  • условия все подходят - работаем

Второй код наглядней и короче

 
fxsaber:

Ничего подобного не показывал. Ким был вынужден делать так из-за отсутствия директивы strict на тот момент.

Предложил именно такой вариант:

А это?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Советники: Diff_TF_MA_EA

fxsaber, 2018.02.02 09:36

Где выверт? Если позиция удовлетворяет условиям, работаем с ней. continue - выверт.


 
fxsaber:

Ничего подобного не показывал. Ким был вынужден делать так из-за отсутствия директивы strict на тот момент.


Странно, а как это я ещё в те времена умудрялся с continue работать - без strict ? Да и не я один - мне тогда так подсказал Витя Николаев (Vinin)

Так что, мне не понятна здесь ваша претензия к коду и программисту, писавшему его в каких-то своих предпочтениях.

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