MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 62

 

負けたトレードと儲かったトレードのストライクの分布を見たいのですが・・・。アレイが苦手なんです。

負けた後の売り

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

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

Alert("Profitable ", Buf1[1], ", Buf1[2], ", Buf1[3], ", Buf1[4], ", Buf1[5], ", Buf1[6], ", Buf1[7], ", Buf1[8], ", Buf1[9], ", Buf1[10]); */。

売り上がり

Price_LastSell=5; Vol=VolumeOpen; Izm=2; Opn_S=true; 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=true; k=k+1;

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

Alert ("Profitable ", Buf1[1], ", Buf1[2], ", Buf1[3], ", Buf1[4], ", Buf1[5], ", Buf1[6], ", Buf1[7], ", Buf1[8], ", Buf1[9], ", Buf1[10]); */。

売り上がり

Price_LastSell=5; Vol=VolumeOpen; Izm=2; Opn_S=true; 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の負けトレード(これはレポートで見ることができます)、1負けトレードの110シリーズ、2負けトレードの80シリーズ、3負けトレードの30シリーズを持っています。

私はこのようにしました。

負けトレードを特定した後

k=k+1である。

収益性の高いトレードを決定した後

if k==1 {k1=k1+1;}.

if k==2 {k2=k2+1;}.

if k==3 {k3=k3+1;}.

k=0;

しかし、この表記は15個以上の損失がある系列では大きすぎて不便である

 
Сергей:

負けたトレードと儲かったトレードの連続。分布 - 例えば、私たちは360の負けトレード(これはレポートで見ることができます)、1負けトレードの110シリーズ、2負けトレードの80シリーズ、3負けトレードの30シリーズを持っています。

私はこのようにしました。

負けトレードを特定した後

k=k+1である。

収益性の高いトレードを決定した後

if k==1 {k1=k1+1;}.

if k==2 {k2=k2+1;}.

if 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が低くなっていることがわかりますが、その前にそれは高く、その後、レベルの下に戻ってきました。

閉じたバーでチェックすれば、このようなことは起こらず、確定したシグナルでエントリーすることができます。

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

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