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 :

가격이 0과 같거나 설정되지 않은 경우 마지막 주문의 가격을 라인 좌표로 할당합니다. 이것으로 모든 것이 괜찮습니다.

매거진도 정상이며 계정을 정상적으로 병합합니다. 보증금 부족에 대한 오류가 표시되지 않습니다.

그러나 선은 여전히 빨간색입니다. 즉, 우리는 구매 라인을 호출하고 사실이며 매개 변수를 전달하지만 다른 것들은 전송됩니다.

이 조건은 확실히 코드에서와 같이 작성되어서는 안됩니다. 당신은 "영웅적으로"극복하기 위해 자신을 위해 어려움을 만듭니다)))

코드에서 빨간색 선을 만드는 모든 것은 주석 처리되어 있으므로 다른 사람이 만들고 있습니다. 또는 코드의 해당 부분이 작동한 이후 차트에 매달려 있습니다.

이전에 여러 번 권장했던 것과 동일한 모든 것을 권장합니다. 모든 작업을 인쇄하고 로그에 (오류) 코드를 반환하면 많은 질문에 대한 답변을 얻을 수 있습니다.

 
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줄로 나누는 방법이 있습니다(문자열 변수에 저장).

AB

CD

EF

 
-Aleks- :

도와주세요!

ABCDEF 문자열을 3줄로 나누는 방법이 있습니다(문자열 변수에 저장).

AB

CD

EF

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