MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 62

 

여러분, 어떻게 하면 더 잘할 수 있는지 알려주세요. 손실 및 수익성 있는 거래로 인한 연속 안타 분포를 보고 싶습니다... 저는 배열을 잘 못합니다.

매도실패 후

Price_LastSell=5; Vol=Vol*Y; Izm=2; Opn_B=참; k=k+1;

/* Buf1[p]=Buf1[p]+1; p=0;

경고 ("수익성", Buf1[1], ", ", Buf1[2], ", ", Buf1[3], ", ", Buf1[4], ", ", Buf1[5], ", " , Buf1[6], ", ", Buf1[7], ", ", Buf1[8], ", ", Buf1[9], ", ", Buf1[10]); */

수익성 있는 판매 후

Price_LastSell=5; 볼륨 = 볼륨 열기; Izm=2; Opn_S=참; p=p+1;

/* Buf2[k]=Buf2[k]+1; k=0;

경고("수익 없음 ", Buf2[1], ", ", Buf2[2], ", ", Buf2[3], ", ", Buf2[4], ", ", Buf2[5], ", " , Buf2[6], ", ", Buf2[7], ", ", Buf2[8], ", ", Buf2[9], ", ", Buf2[10], ", ", Buf2[11] , ", ", Buf2[12], ", ", Buf2[13], ", ", Buf2[14], ", ", Buf2[15]); */

여기서 무슨 문제가 있습니까? /*에 쓰지 않고도 모든 것이 잘 작동합니다...

 
Сергей :

여러분, 최선의 방법을 알려주세요. 손실 및 수익성 있는 거래로 인한 연속 안타 분포를 보고 싶습니다... 저는 어레이에 강하지 않습니다.

매도실패 후

Price_LastSell=5; Vol=Vol*Y; Izm=2; Opn_B=참; k=k+1;

/* Buf1[p]=Buf1[p]+1; p=0;

경고("수익성", Buf1[1], ", ", Buf1[2], ", ", Buf1[3], ", ", Buf1[4], ", ", Buf1[5], ", " , Buf1[6], ", ", Buf1[7], ", ", Buf1[8], ", ", Buf1[9], ", ", Buf1[10]); */

수익성 있는 판매 후

Price_LastSell=5; 볼륨 = 볼륨 열기; Izm=2; Opn_S=참; p=p+1;

/* Buf2[k]=Buf2[k]+1; k=0;

경고("수익 없음 ", Buf2[1], ", ", Buf2[2], ", ", Buf2[3], ", ", Buf2[4], ", ", Buf2[5], ", " , Buf2[6], ", ", Buf2[7], ", ", Buf2[8], ", ", Buf2[9], ", ", Buf2[10], ", ", Buf2[11] , ", ", Buf2[12], ", ", Buf2[13], ", ", Buf2[14], ", ", Buf2[15]); */

여기서 무슨 문제가 있습니까? /*에 쓰지 않고도 모든 것이 잘 작동합니다...

오오... 그리고 "줄무늬"는 누구이며 "그들의 분포"는 무엇입니까?
 

일련의 손실 및 수익성 거래. 분포 - 예를 들어 360개의 손실 거래(보고서에서 볼 수 있음), 110개의 시리즈 손실 거래, 80개의 시리즈 손실 2개 거래 및 30개/3개의 손실 거래가 있습니다.

난 이걸했다:

손실 거래를 식별한 후

k=k+1;

수익성 있는 거래를 식별한 후

k==1인 경우 {k1=k1+1;}

k==2인 경우 {k2=k2+1;}

k==3인 경우 {k3=k3+1;}

k=0;

하지만 이 항목은 15개 이상의 시리즈에 너무 크고 불편합니다.

 
Сергей :

일련의 손실 및 수익성 거래. 분포 - 예를 들어 360개의 손실 거래(보고서에서 볼 수 있음), 110개의 시리즈 손실 거래, 80개의 시리즈 손실 2개 거래 및 30개/3개의 손실 거래가 있습니다.

난 이걸했다:

손실 거래를 식별한 후

k=k+1;

수익성 있는 거래를 식별한 후

k==1인 경우 {k1=k1+1;}

k==2인 경우 {k2=k2+1;}

k==3인 경우 {k3=k3+1;}

k=0;

하지만 이 항목은 15개 이상의 시리즈에 너무 크고 불편합니다.

당신의 임무는 완전히 명확하지 않습니다.

마지막으로 수익성이 있는/잃는 위치의 시리즈를 결정해야 합니까, 아니면 전체 거래 내역에서 이 시리즈를 모두 수집해야 합니까?

 
역사를 통틀어. 테스트가 끝나면 데이터를 수집하고 공개합니다. 그러나 나는 간단하게 합니다. 첫 번째 수익성 있는 것 이후, 일련의 무익한 것 이후에 쉼표로 간단히 구분된 경고와 함께 수량을 표시합니다. 로그에서 찾아서 분석합니다. 하지만 배열을 통해 수행하려는 코드를 단순화하고 싶었습니다. 가능합니까? 그리고 그것을 하는 가장 좋은 방법은 무엇입니까?
 
Ibragim Dzhanaev :

나는 이것을했고, 이제는 모든 틱 에서 열리지 않지만 진입 신호를 전달합니다 ...

double tp,sl,OrderBuy= 0 ,OrderSell= 0 ;
double slSell,slBuy,tpSell,tpBuy,TotalBiu,TotalSell;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) //Цикл по всем ордерам
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNumber) //Выбрали ордер
        {
         if ( OrderType ()== OP_BUY )
           {
            TotalBiu++;                       //Кол. покупок
           }
         if ( OrderType ()== OP_SELL )
           {
            TotalSell++;                     //Кол. продаж
           }
        }
     }
   double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );
   double rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 1 );
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if (StopLoss> 0 ) StopLossLevel= Bid -StopLoss* Point ; else StopLossLevel= 0.0 ;
   if (TakeProfit> 0 ) TakeProfitLevel= Ask +TakeProfit* Point ; else TakeProfitLevel= 0.0 ;

   tpBuy= NormalizeDouble ( Ask +TakeProfit* _Point , _Digits );
   slBuy= NormalizeDouble ( Bid -StopLoss* _Point , _Digits );

   tpSell= NormalizeDouble ( Bid -TakeProfit* _Point , _Digits );
   slSell= NormalizeDouble ( Ask +StopLoss* _Point , _Digits );
///---
if (TotalBiu== 0 )
   if (OrderBuy< 1 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket= OrderSend ( _Symbol , OP_BUY ,Lot, Ask ,slippage,slBuy,tpBuy, NULL ,MagicNumber, 0 , clrBlue );      
     }
       if (TotalSell== 0 )    
   if (OrderSell< 1 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket= OrderSend ( _Symbol , OP_SELL ,Lot, Bid ,slippage,slSell,tpSell, NULL ,MagicNumber, 0 , clrRed );      
     }
  }
//+------------------------------------------------------------------+


수정했습니다. 작동해야

double tp,sl,OrderBuy= 0 ,OrderSell= 0 ;
double slSell,slBuy,tpSell,tpBuy,TotalBiu,TotalSell;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) //Цикл по всем ордерам
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNumber) //Выбрали ордер
        {
         if ( OrderType ()== OP_BUY )
           {
            OrderBuy++;                       //Кол. покупок
           }
         if ( OrderType ()== OP_SELL )
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );
   double rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 1 );
//+------------------------------------------------------------------+

   double StopLossLevel;
   double TakeProfitLevel;
   if (StopLoss> 0 ) StopLossLevel= Bid -StopLoss* Point ; else StopLossLevel= 0.0 ;
   if (TakeProfit> 0 ) TakeProfitLevel= Ask +TakeProfit* Point ; else TakeProfitLevel= 0.0 ;

   tpBuy= NormalizeDouble ( Ask +TakeProfit* _Point , _Digits );
   slBuy= NormalizeDouble ( Bid -StopLoss* _Point , _Digits );

   tpSell= NormalizeDouble ( Bid -TakeProfit* _Point , _Digits );
   slSell= NormalizeDouble ( Ask +StopLoss* _Point , _Digits );
///---
   if (OrderBuy== 0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket= OrderSend ( _Symbol , OP_BUY ,Lot, Ask ,slippage,slBuy,tpBuy, NULL ,MagicNumber, 0 , clrBlue );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
   if (OrderSell== 0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket= OrderSend ( _Symbol , OP_SELL ,Lot, Bid ,slippage,slSell,tpSell, NULL ,MagicNumber, 0 , clrRed );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
  }
//+------------------------------------------------------------------+

...

 
Sergey Gritsay :

수정했습니다. 작동해야

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) //Цикл по всем ордерам
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNumber) //Выбрали ордер
        {
         if ( OrderType ()== OP_BUY )
           {
             OrderBuy++;                        //Кол. покупок
           }
         if ( OrderType ()== OP_SELL )
           {
             OrderSell++;                      //Кол. продаж
           }
        }
     }
   double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );
   double rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 1 );
//+------------------------------------------------------------------+


선택을 재설정해야 할 것 같습니다

double tp,sl,OrderBuy= 0 ,OrderSell= 0 ;
double slSell,slBuy,tpSell,tpBuy;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   OrderBuy= 0 ; OrderSell= 0 ;
//-
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) //Цикл по всем ордерам
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNumber) //Выбрали ордер
        {
         if ( OrderType ()== OP_BUY )
           {
            OrderBuy++;                       //Кол. покупок
           }
         if ( OrderType ()== OP_SELL )
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );
   double rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 1 );
//+------------------------------------------------------------------+
   tpBuy= NormalizeDouble ( Ask +TakeProfit* _Point , _Digits );
   slBuy= NormalizeDouble ( Bid -StopLoss* _Point , _Digits );

   tpSell= NormalizeDouble ( Bid -TakeProfit* _Point , _Digits );
   slSell= NormalizeDouble ( Ask +StopLoss* _Point , _Digits );
///---
   if (OrderBuy== 0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket= OrderSend ( _Symbol , OP_BUY ,Lot, Ask ,slippage,slBuy,tpBuy, NULL ,MagicNumber, 0 , clrBlue );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
   if (OrderSell== 0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket= OrderSend ( _Symbol , OP_SELL ,Lot, Bid ,slippage,slSell,tpSell, NULL ,MagicNumber, 0 , clrRed );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
  }
//+------------------------------------------------------------------+
 
Vitaly Muzichenko :

선택을 재설정해야 할 것 같습니다

double tp,sl,OrderBuy= 0 ,OrderSell= 0 ;
double slSell,slBuy,tpSell,tpBuy;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   OrderBuy= 0 ; OrderSell= 0 ;
//-
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--) //Цикл по всем ордерам
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNumber) //Выбрали ордер
        {
         if ( OrderType ()== OP_BUY )
           {
            OrderBuy++;                       //Кол. покупок
           }
         if ( OrderType ()== OP_SELL )
           {
            OrderSell++;                     //Кол. продаж
           }
        }
     }
   double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );
   double rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 1 );
//+------------------------------------------------------------------+
   tpBuy= NormalizeDouble ( Ask +TakeProfit* _Point , _Digits );
   slBuy= NormalizeDouble ( Bid -StopLoss* _Point , _Digits );

   tpSell= NormalizeDouble ( Bid -TakeProfit* _Point , _Digits );
   slSell= NormalizeDouble ( Ask +StopLoss* _Point , _Digits );
///---
   if (OrderBuy== 0 && rsi>Urov_70 && rsi1<Urov_70)
     {
      tiket= OrderSend ( _Symbol , OP_BUY ,Lot, Ask ,slippage,slBuy,tpBuy, NULL ,MagicNumber, 0 , clrBlue );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
   if (OrderSell== 0 && rsi<Urov_30 && rsi1>Urov_30)
     {
      tiket= OrderSend ( _Symbol , OP_SELL ,Lot, Bid ,slippage,slSell,tpSell, NULL ,MagicNumber, 0 , clrRed );  
       if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());    
     }
  }
//+------------------------------------------------------------------+

고맙습니다. 이제 신호가 아닌 일부 주문과 잘못된 주문을 엽니다.

 
Sergey Gritsay :

수정했습니다. 작동해야

 

...

당신이 쓴 것이 작동하지 않았습니다 ...
 
Ibragim Dzhanaev :

고맙습니다. 이제 신호가 아닌 일부 주문과 잘못된 주문을 엽니다.

기존 막대를 확인 중입니다. double rsi= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 0 );

가격이 오르고 레벨 70을 넘어 무역에 진입합니다. 막대가 닫히면 이미 RSI가 더 낮은 것을 볼 수 있지만 그 전에는 더 높았다가 다시 수준 아래로 돌아갔습니다.

닫힌 막대를 확인하면 이런 일이 발생하지 않고 확인된 신호에 항목이 표시됩니다.

이중 rsi= iRSI ( _Symbol , 0 , RSIperiod , PRICE_CLOSE , 1 );

이중 rsi1= iRSI ( _Symbol , 0 ,RSIperiod, PRICE_CLOSE , 2 );