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

 
ilnur17021992:

Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
    
         
      }
   }

Думаю разберётесь:

//----------------- Возвращает суммарный профит последних закрытых позиций ---------------------+
double GetProfitOldClosePos(string symb="", int type=-1, int mg=-1) {
if(symb=="0") symb=Symbol();
datetime gt=0,ct=0;
double pr=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
    if(OrderSymbol()==symb &&(type<0||OrderType()==type)&& OrderMagicNumber()==mg) {
     ct=OrderCloseTime();
     // 120 секунд разницы между закрытием первой и последней в сетке
      if((gt<=ct && ct<=gt+120) || gt==0) {
       gt=ct;
       pr+=OrderProfit()+OrderCommission()+OrderSwap();
  }}}}
  return(pr);
}
 
ilnur17021992:

Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.

   int CountClosedSellOrders=0, CountClosedBuyOrders;
   double ClosingSellProfit=0, ClosingBuyProfit;
   for(int i=0; i<OrdersHistoryTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
      {
         if(OrderType()==OP_SELL)
         {
            if(. . .)                    
            {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         if(OrderType()==OP_BUY)
         {
            if(. . .)                    
            {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
            }
         }
      }
   }


 

   int CountClosedSellOrders=0,CountClosedBuyOrders;
   double ClosingSellProfit=0,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
   for(int i=OrdersHistoryTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
        {
         if(OrderCloseTime()>=TimeCurrent()-60)
           {
            if(OrderType()==OP_SELL)
              {
               CountClosedSellOrders++;
               ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
            if(OrderType()==OP_BUY)
              {
               CountClosedBuyOrders++;
               ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
...
 
Как указать трейлинг стоп при открытии ордера? 
 
DenZell:
Как указать трейлинг стоп при открытии ордера? 
Никак. Стоп тралят после открытия.
 
trader781:

если цена равна нулю или не задана то назначим координатой линии цену последнего ордера. С этим все норм

Журнал тоже норм, сливает счет как и нужно. Ошибки про нехватку депозита я не смотрю.

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

Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))

Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.

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

 
Andrey Koldorkin:
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Шаблон у вас не полный - вы скорее всего не задали в мастере буферы индикатора, в которые будут записываться посчитанные данные.

Но основной принцип для большинства индикаторов таков:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vitalie Postolache:

Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))

Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.

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

мистика в 200 строк

:) 

 
Artyom Trishkin:
Шаблон у вас не полный - вы скорее всего не задали в мастере буферы индикатора, в которые будут записываться посчитанные данные.

Но основной принцип для большинства индикаторов таков:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<1) return(0);              // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то проверять нужно это количество, а не 1
  
   //--- Действия для полного перерасчёта индикатора
   int limit=rates_total-prev_calculated;    // количество посчитанных уже баров
   if(limit>1) {                             // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
      limit=rates_total-1;                   // задаём количество требуемых для расчёта баров равным количеству баров в истории,
                                             // если для расчёта требуются некое количество баров слева от индекса цикла, ...
                                             // ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
                                             // так же тут нужно при необходимости произвести инициализацию буферов индикатора
      }
  
   //--- Основной цикл индикатора
   for(int i=limit; i>=0; i--) {
      // тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
      ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0;   // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
      }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Ок. Спасибо! Перенес себе. Буду разбираться.
 

Прошу помощи!

Есть строка ABCDEF как разделить её на 3 строки (сохранить в переменную string):

AB

CD

EF 

 
-Aleks-:

Прошу помощи!

Есть строка ABCDEF как разделить её на 3 строки (сохранить в переменную string):

AB

CD

EF 

string  StringSubstr(
   string  string_value,     // строка
   int     start_pos,        // с какой позиции начать
   int     length=0          // длина извлекаемой строки
   );
...
Причина обращения: