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

 

안녕하세요 !

내가 실수한 곳을 봐주세요 (일하기 싫습니다)

조건: if (GetLotSize()>LotControl)- 구매 신호가 편차 * _Point 매개변수 (매개변수에서 설정) 만큼 이동합니다.

LotControl - 설정에서도 설정

GetLotSize() - 권장 사항:

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }
 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
 {

   if (GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point ;}
   
   else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if (bSignalBuy() == true )
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if (bSignalSell() == true )
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt= 0 ;
   int i= OrdersTotal ()- 1 ;
   for ( int pos=i;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()== _Symbol )
           {
             if (OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return (cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (openPrice > Open[ 1 ] && openPrice < Close[ 1 ]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
   return ( true );
   
   return ( false );
  }
 
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
   
  {
   if (openPrice< Open[ 1 ] && openPrice > Close[ 1 ])

   return ( true );

   return ( false );
  }

 
законопослушный гражданин # :

고맙습니다. 어떤 이유로 작동하지 않았습니다.

 //+----------------------------------------------------------------------------+
if (bSignalBuy())
  {
   if (GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+
 
законопослушный гражданин # :

고맙습니다. 어떤 이유로 작동하지 않았습니다.

나는 썼다:

 if (bSignalBuy()) {
   if (GetLotSize() > LotControl)
    vOrderOpenSell();
   else
    vOrderOpenBuy();
}

그러나 여전히 동일한 틱에 반대 방향의 두 위치가 열려 있습니까? 그럴 수 없어!

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }

이 코드를 희생하더라도 아무 것도 변경되지 않았을 수 있습니다. 주문이 마감되기 때문입니다.

알고리즘을 제대로 이해하게 될 것입니다.

 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
 {

   if (GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point ;}
   
   else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if (bSignalBuy() == true )
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if (bSignalSell() == true )
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL( "lab_Take" , 1 , 5 , 0 ,Color(GetProfitFromStart()> 0 ,Lime,Red), StringConcatenate ( "Profit: " ,DoubleToStr(GetProfitFromStart(), 2 ),AC));
  }

여기에서는 일반적으로 매수 및 매도 신호에 진입하며 그 이상은 없습니다. 여기에서 당신에게 적합하지 않은 것은 무엇입니까?... 시장의 진입 기능도, 퇴출 기능도 아닙니다...

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

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

MakarFX , 2021.12.02 18:30

 //+----------------------------------------------------------------------------+
if (bSignalBuy())
  {
   if (GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+

그리고 여기 무엇? 당신은 정말 아무것도 변경하지 않았습니다. 방금 OrderCloseTime을 더 많이 호출했습니다. 코드는 한 줄로 뽑아냈습니다. 그리고 가독성이 떨어졌습니다. 그러나 결과는 동일하게 유지됩니다.

 
Mihail Matkovskij # :

그리고 여기 무엇? 당신은 정말 아무것도 변경하지 않았습니다. 방금 OrderCloseTime을 더 많이 호출했습니다. 그러나 결과는 동일합니다.

눈을 떠
 
MakarFX # :
눈을 떠

스튜디오에서 논쟁을 해주세요.

 
Mihail Matkovskij # :

스튜디오에서 논쟁을 해주세요.

이제 눈을 떠

 
Mihail Matkovskij # :

그리고 여기 무엇? 당신은 정말 아무것도 변경하지 않았습니다. 방금 OrderCloseTime을 더 많이 호출했습니다. 그리고 코드를 한 줄로 뽑아냈습니다. 그리고 가독성이 떨어졌습니다. 그러나 결과는 동일하게 유지됩니다.

내가 볼 수있는 한 차이점은 다음과 같습니다.

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ( )- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }



double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
мне как то объясняли, что один вариант считает с конца списка, а второй с начала.
 
MakarFX # :

이제 눈을 떠

좋은. 나는 이 순간을 놓쳤다. 인정합니다.

 
законопослушный гражданин # :

내가 볼 수있는 한 차이점은 다음과 같습니다.

 double GetLotSize()
  {
   double Ls= 0 ;
   datetime last = 0 , openTime;
   for ( int pos= OrdersTotal ( )- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }




double GetLotSize()
  {
   double Ls= 0 ;
   datetime t= 0 ;
   int i=OrdersHistoryTotal();
   for ( int pos= 0 ; pos<i; pos++)
     {
       if ( OrderSelect (pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()== _Symbol && OrderMagicNumber()==Magic)
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }