新人对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个亏损交易(这可以在报告中看到),110个系列的1个亏损交易,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个系列的1个亏损交易,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:

谢谢你。现在打开的一些订单没有信号,有些则不正确。

你在一个现有的柱子上检查,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);