Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 979

 
Rustam Bikbulatov:
Привет, нужен совет. Почему у меня не показывается последний текст? Что тут не так? Подскажите пожалуйста как исправить!

Зачем цикл, если берёте имя всегда только одного объекта?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

Так точно нельзя - выход за пределы массива будет. Если объектов 10, то индекс последнего будет 9. Потому как счёт идёт с нуля.

 
Artyom Trishkin:

Зачем цикл, если берёте имя всегда только одного объекта?

подскажите как точно определить предпоследнее текст этого объекта.

 
Rustam Bikbulatov:

подскажите как точно определить предпоследнее текст этого объекта.

Сложно понять что хотите.

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - показывает общую прибыль во время теста в течении суток

Provit1 - оставляет максимальную просадку за сутки

Provit2 - обычный цифровой ряд начиная с единицы. 

Provit3 - Цель! Суммировать Provit1 и делить на Provit2. Хочу узнать среднюю суточную просадку за общее время теста.  Помогите разобраться с Provit3 

 

Коллеги - что это может быть за ошибка закрытия и как с ней бороться? Вот ниже код, при превышении профита - закрывать все однонаправленные позы. Спасибо.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

Коллеги - что это может быть за ошибка закрытия и как с ней бороться? Вот ниже код, при превышении профита - закрывать все однонаправленные позы. Спасибо.

ошибка какая? скрин не тот

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


уберите OrderClose(....) и вместо него  Кимовскую ClosePosBySelect() https://www.mql5.com/ru/forum/131859/page2#comment_3359664

используйте, тогда ясно станет где не работает - или в Ваших условиях на закрытие или сервер у Вас с каким приколом

 
Igor Makanu:

ошибка какая? скрин не тот

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


уберите OrderClose(....) и вместо него тикет в Кимовскую ClosePosBySelect() передавайте, тогда ясно станет где не работает - или в Ваших условиях на закрытие или сервер у Вас с каким приколом

У него там закрытие по нулевой цене. Соответственно, нужно контролировать что вернула MarketInfo-функция, а контроля-то нет. Впрочем, как обычно на четвёрке некоторые люди привыкли писать - что-то получил, что - не проверил, но отправил аргументом.

 
Artyom Trishkin:

У него там закрытие по нулевой цене. Соответственно, нужно контролировать что вернула MarketInfo-функция, а контроля-то нет. Впрочем, как обычно на четвёрке некоторые люди привыкли писать - что-то получил, что - не проверил, но отправил аргументом.

я видел, сомневаюсь, что сумеет все сам распринтовать, поэтому и предложил использовать проверенное закрытие  выделенного ордера  через OrderSelect() с помощью ClosePosBySelect() - это он умеет, по крайней мере видел как он конструктором себе коды собирает )))

ЗЫ: есть еще подозрение, что он один ордер два раза закрывает, но Кимовская ф-ция принты в журнал напишет        , нет вроде раздельные циклы на закрытия по 2-му условию

 
Igor Makanu:

я видел, сомневаюсь, что сумеет все сам распринтовать, поэтому и предложил использовать проверенное закрытие  выделенный ордер через OrderSelect() 

Да понятно, что функции Игоря всё сделают за юзера сами (и то некоторые умудряются и с ними накосячить). Но он тогда сам так ничего и не научится делать. Хотя конечно - их выбор.

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