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

 
MakarFX # :

다른 옵션을 알고 있다면 다음을 작성하십시오 ...

사람들을 도우십시오)

init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다(게으를 필요가 없음)

또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다.

 
Volodymyr Zubov # :

init에서 모든 변수를 별도로 만들고 추가 처리를 위해 분리합니다 (게으를 필요가 없음)

또한 대괄호로 블록을 할당하고 반환 변수를 비교합니다.

어떻게하는지 보여줘.
 

어딘가에 그렇게...

올빼미 전체를 배치하고 싶었지만 포럼에서는 제공하지 않습니다.

어떤 조각이 필요합니까?

 
Volodymyr Zubov # :

어딘데 그렇게...

어떤 조각이 필요합니까?

찰로...
 
알아요)
 

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

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

MakarFX , 2021.10.08 18:43

 //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (CheckForOpen()== 0 )
     {
       if ( OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue)) Print ( "BUY OK" );
     }
   if (CheckForOpen()== 1 )
     {
       if ( OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red)) Print ( "SELL OK" );
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int     res=- 1 , buy= 0 , sell= 0 ;
   // Считывание параметров индикаторов 3 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 3 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 3 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 3 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 3 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 2 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 2 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 2 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 2 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 2 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 1 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 1 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 1 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 1 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 1 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   // Считывание параметров индикаторов 0 свечи
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE , 0 );
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW , 0 );
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW , 0 );
   macd= iMACD ( NULL , 0 , 15 , 26 , 1 , PRICE_CLOSE ,MODE_MAIN, 0 );
   if (malw>mas1&&malw>mas2&&macd> 0 ) {buy+= 1 ; sell= 0 ;}
   if (malw<mas1&&malw<mas2&&macd< 0 ) {buy= 0 ; sell+= 1 ;}
   
   if (buy == 4 ) res= 0 ;
   if (sell== 4 ) res= 1 ;
   return (res);
  }

함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다...

저것들.

 int SignalByPuria( const int bar)
{
   malw= iMA ( NULL , 0 ,MovingPeriodLw, 0 , MODE_EMA , PRICE_CLOSE ,bar);
   mas1= iMA ( NULL , 0 ,MovingPeriodS1, 0 , MODE_LWMA , PRICE_LOW ,bar);
   mas2= iMA ( NULL , 0 ,MovingPeriodS2, 0 , MODE_LWMA , PRICE_LOW ,bar);
......
}

때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE};

그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다.

 E_CMD Signal_ind_1( const int bar)
{
....
}

 E_CMD Signal_ind_2( const int bar)
{
....
}

 E_CMD Signal_ind_2( const int bar)
{
....
}

void OnTick ()
{
..... 

if (Signal_ind_1 = =CMD_BUY && Signal_ind_2 == CMD_BUY && Signal_ind_3 == CMD_BUY) // открываем ордер на покупку
 else if (Signal_ind_1 = =CMD_SELL && Signal_ind_2 == CMD_SELL && Signal_ind_3 == CMD_SELL) // открываем ордер на продажу

....
}

IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다.

 
Igor Makanu # :

함수에서 동일한 표시기 호출을 래핑하는 것이 필요했다고 생각합니다. 코드가 더 간결해질 것이며, 이제 4개 막대에서 표시기 값을 사용하고 내일 5개에서 표시기 값을 사용합니다...

저것들.

때때로 지정된 막대에 거래 신호가 없는 지표가 있습니다. 저는 일반적으로 열거형을 사용합니다. enum E_CMD{CMD_BUY,CMD_SELL,CMD_NONE};

그러면 "signal" 함수의 서명은 E_CMD SignalByPuria(const int bar) 가 됩니다. 음, EA 코드 자체는 다음과 같이 바뀝니다.

IMHO, 이 접근 방식을 사용하면 이미 작성된 EA 코드에 새로운 거래 신호를 빠르게 추가할 수 있습니다.

감사합니다 Igor, 서비스에 사용할 것입니다)
 

대화로 돌아가서 MT4의 마켓 오픈 포지션 기능이 있습니다.

 //+------------------------------------------------------------------+
//|                                                   Zero_Level.mq4 |
//|                                         Copyright © 2007, Xupypr |
//+------------------------------------------------------------------+
// Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов.
double Zero_Level( string sy, int mn)
  {
   double ZeroLevel= 0 ;
   double BuyLots= 0 ;
   double SellLots= 0 ;
   double BuyProfit= 0 ;
   double SellProfit= 0 ;
   double SellLevel;
   double BuyLevel;

   int Total= OrdersTotal ();
   for ( int i=Total- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
        {

         if (OrderSymbol()!=sy)
             continue ;
         if (OrderMagicNumber() != mn)
             continue ;

         if (OrderType()==OP_BUY)
           {
            BuyLots=BuyLots+OrderLots();
            BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap();
           }
         if (OrderType()==OP_SELL)
           {
            SellLots=SellLots+OrderLots();
            SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }

   double TickValue=MarketInfo(sy,MODE_TICKVALUE);
   if (BuyLots> 0 )
      BuyLevel= NormalizeDouble (MarketInfo(sy,MODE_BID)-(BuyProfit/(TickValue*BuyLots)*MarketInfo(sy,MODE_POINT)),( int )MarketInfo(sy,MODE_DIGITS));
   else
      BuyLevel= 0 ;
   if (SellLots> 0 )
      SellLevel= NormalizeDouble (MarketInfo(sy,MODE_ASK)+(SellProfit/(TickValue*SellLots)*MarketInfo(sy,MODE_POINT)),( int )MarketInfo(sy,MODE_DIGITS));
   else
      SellLevel= 0 ;
   if (BuyLevel> 0 )
      ZeroLevel=BuyLevel;
   if (SellLevel> 0 )
      ZeroLevel=SellLevel;

   return NormalizeDouble (ZeroLevel, _Digits ); //Нормализовали полученную цену
  }
//--- End ---
 //+---------------------------------------------------------------------------+
//|     Функция открытия рыночной позиции  (c) Boshetunmay 2021                  |
//+---------------------------------------------------------------------------+
//|  Параметры:                                                               |
//|    sy - наименование инструмента                                          |
//|    op - операция                                                          |
//|    ll - лот                                                               |
//|    slipp - проскальзывание                                                |
//|    sl - уровень стоп                                                      |
//|    tp - уровень тейк                                                      |
//|    comment - коментарий                                                   |
//|    mn - MagicNumber                                                       |
//|    cl - цвет значка открытия                                              |
//+---------------------------------------------------------------------------+
//  OpenPosition(string symbol,int operation,double volume,int slippage,int stoploss,int takeprofit,string comment,int magic,color);
int OpenPosition( string sy, int op, double ll, int slipp, int sl, int tp, string comment, int mn, color cl)
  {
   if (op == OP_BUY)   // открытие BUY
     {
       // проверяем доступность свободных средств
       if ((AccountFreeMarginCheck(sy,OP_BUY,ll)<= 0 ) || ( GetLastError ()== 134 ))
        {
         Print (sy, " " ,ll, " It is impossible to open the order Buy, not enough money." );
         return ( 0 );
        }
      RefreshRates();

       // открываем ордер OP_BUY
       int ticketbuy = OrderSend (sy,OP_BUY,ll,MarketInfo(sy,MODE_ASK),slipp, 0 , 0 ,comment,mn, 0 ,cl);
       if (ticketbuy< 0 )
         Print (sy, " OpenPosition. OrderSend Buy fail #" , GetLastError ());
       else
         Print (sy, " OpenPosition. OrderSend Buy successfully" );

       Sleep ( 1000 );

       // модифицируем ордер (выставляем тейпрофит и стоплосс)
       if (sl != 0 || tp != 0 )
        {
         //--- получим минимальное значение Stop level
         double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL);
         Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
         //--- вычисленные значения цен SL и TP должны быть нормализованы
         double BSLoss = NormalizeDouble (Zero_Level( _Symbol ,mn)-(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS));
         double BTProfit = NormalizeDouble (Zero_Level( _Symbol ,mn)+(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS));
         //--- если входящие значения ноль то заменяем цену модификации на ноль
         if (sl == 0 )
            BSLoss = 0 ;
         if (tp == 0 )
            BTProfit = 0 ;

         bool resbuy = OrderModify(ticketbuy,OrderOpenPrice(),BSLoss,BTProfit, 0 , clrNONE );
         if (!resbuy)
             Print (sy, " OpenPosition. OrderModify Buy fail #" , GetLastError ());
         else
             Print (sy, " OpenPosition. OrderModify Buy successfully" );
        }
     }

   if (op == OP_SELL)   // открытие Sell
     {
       // проверяем доступность свободных средств
       if ((AccountFreeMarginCheck(sy,OP_SELL,ll)<= 0 ) || ( GetLastError ()== 134 ))
        {
         Print (sy, " " ,ll, " It is impossible to open the order Sell, not enough money." );
         return ( 0 );
        }
      RefreshRates();

       // открываем ордер OP_SELL
       int ticketsell = OrderSend (sy,OP_SELL,ll,MarketInfo(sy,MODE_BID),slipp, 0 , 0 ,comment,mn, 0 ,cl);
       if (ticketsell< 0 )
         Print (sy, " OpenPosition. OrderSend Sell fail #" , GetLastError ());
       else
         Print (sy, " OpenPosition. OrderSend Sell successfully" );

       Sleep ( 1000 );

       // модифицируем ордер (выставляем тейпрофит и стоплосс)
       if (sl != 0 || tp != 0 )
        {
         //--- получим минимальное значение Stop level
         double minstoplevel=MarketInfo(sy,MODE_STOPLEVEL);
         Print ( "Minimum Stop Level=" ,minstoplevel, " points" );
         //--- вычисленные значения цен SL и TP должны быть нормализованы
         double SSLoss = NormalizeDouble (Zero_Level( _Symbol ,mn)+(sl+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS));
         double STProfit = NormalizeDouble (Zero_Level( _Symbol ,mn)-(tp+minstoplevel)*MarketInfo(sy,MODE_POINT),( int )MarketInfo(sy,MODE_DIGITS));
         //--- если входящие значения ноль то заменяем цену модификации на ноль
         if (sl == 0 )
            SSLoss = 0 ;
         if (tp == 0 )
            STProfit = 0 ;

         bool ressell = OrderModify(ticketsell,OrderOpenPrice(),SSLoss,STProfit, 0 , clrNONE );
         if (!ressell)
             Print (sy, " OpenPosition. OrderModify Sell fail #" , GetLastError ());
         else
             Print (sy, " OpenPosition. OrderModify Sell successfully" );
        }
     }
   return ( 1 );
  }
//--- End ---

오늘 무역 플래그를 반환합니다.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int isTradeToDay( string sy= "" , int op=- 1 , int mn=- 1 )
  {
   int i, k=OrdersHistoryTotal();

   if (sy== "0" )
      sy= _Symbol ;
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
        {
         if (OrderSymbol()==sy || sy== "" )
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (op< 0 || OrderType()==op)
                 {
                   if (mn< 0 || OrderMagicNumber()==mn)
                    {
                     if (TimeDay(OrderOpenTime())==Day()
                        &&  TimeMonth(OrderOpenTime())==Month()
                        &&  TimeYear(OrderOpenTime())==Year())
                         return ( 1 );
                    }
                 }
              }
           }
        }
     }
   k= OrdersTotal ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()==sy || sy== "" )
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (op< 0 || OrderType()==op)
                 {
                   if (mn< 0 || OrderMagicNumber()==mn)
                    {
                     if (TimeDay(OrderOpenTime())==Day()
                        &&  TimeMonth(OrderOpenTime())==Month()
                        &&  TimeYear(OrderOpenTime())==Year())
                         return ( 1 );
                    }
                 }
              }
           }
        }
     }
   return ( 0 );
  }
//--- End ---

위치 수를 반환합니다.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions( string sy= "" , int op=- 1 , int mn=- 1 )
  {
   int i, k= OrdersTotal (), kp= 0 ;

   if (sy== "0" )
      sy= _Symbol ;
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol()==sy || sy== "" )
           {
             if (OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if (op< 0 || OrderType()==op)
                 {
                   if (mn< 0 || OrderMagicNumber()==mn)
                     kp++;
                 }
              }
           }
        }
     }
   return (kp);
  }
//--- End ---

현재 모든 것이 터미널 빌드에 최적화되어 있습니다.

 
Volodymyr Zubov 위치 수를 반환합니다.

현재 모든 것이 터미널 빌드에 최적화되어 있습니다.

왜 손가락이 있는지 이해하지 못합니까?
 
MakarFX # :
왜 여기에 손가락이 있는지 이해하지 못합니까?

여기에서 OrderSend를 밀어 넣는 것만으로는 가치가 없다는 점을 지적하고 두려워하는 것은 좋지 않습니다. 적절하게 사면과 슈카티를 받으십시오.