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

 

테스터용

 OrderSend

빠른 서버에서도 작동하지만 테스터가 아닌 경우 문서에 따라 수행하는 것이 좋습니다. :)

 
여러분, 도움이 필요합니다. 며칠 동안 다음 코드를 필요한 대로 변경할 수 없습니다.
 void start()
{
   StopLevel = MarketInfo( Symbol (), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if (timeprev == Time[ 0 ]) return ;
   timeprev = Time[ 0 ];
   
   // Открытие ордера по методу Пуриа
   CheckForOpen();
}
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
{
   double malw,mas1,mas2,macd;
   int     res;  
   // Считывание параметров индикаторов
   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  && OrderSell)
     {
     OrderBuy= true ;
     OrderSell= false ;
     Order= true ;
     }
   
   if (malw<mas1 && malw<mas2  && OrderBuy)
     {
     OrderBuy= false ;
     OrderSell= true ;
     Order= true ;
     }

   // Открываем ордер Buy
   if (macd> 0 && OrderBuy && Order)
     {
     res= OrderSend ( Symbol (),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss* Point ,Ask+TakeProfit* Point , "" ,MagicNumber, 0 ,Blue);
     Order= false ;
     return ;
     }     
   // Открываем ордер Sell   
   if (macd< 0 && OrderSell && Order)
     {
     res= OrderSend ( Symbol (),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss* Point ,Bid-TakeProfit* Point , "" ,MagicNumber, 0 ,Red);
     Order= false ;
     return ;
     }
 
}  
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()   // Расчет объема лота
{
   double Lots;
   if (Lot > 0 ) return (Lot);
   Lots=AccountFreeMargin()/ 5000 ;
   Lots= MathMin ( 15 , MathMax ( 0.01 ,Lots));
   if (Lots< 0.1 ) Lots= NormalizeDouble (Lots, 2 );
   else 
     {
     if (Lots< 1 ) Lots= NormalizeDouble (Lots, 1 );
     else        Lots= NormalizeDouble (Lots, 0 );
     }
   return (Lots);
}
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()   // Опредеоение начального пересечения мувингов
{
   double malw,mas1,mas2;
   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 );

   if ((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
     Init= false ;
     OrderBuy= true ;
     OrderSell= true ;
     }   
   return;
}

사실, 내가 시도했지만 여기에 추가할 수 없었던 것: 지표의 모든 조건이 일치한 후(양초 시가에서), 어드바이저가 연속으로 4개의 양초 시가를 기다리도록 합니다 .


  1. 1. 첫 번째 캔들의 시가 - (5) (75) 및 (85) + MACD 바가 0 이상 - 확인 4개 중 1개 ;
    2. 두 번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4개 중 2개의 확인이 ;
    3. 3번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4건 중 3건은 ;
    4. 4번째 캔들 시가 - (5) (75) 및 (85) + MACD 바 0 이상 시가 -   4개 중 4개 확인    같은 양초(4일)에 매수할 거래를 엽니다.

에 대한 주문과 유사한 상황   매도 , 지표만 다른 방향으로 열려야 합니다. 그리고 중요한 점이 있습니다. 예를 들어 첫 번째 양초에서 네 번째 양초까지의 어느 단계에서나   표시기가 위치를 변경합니다.   (예를 들어, 3번째 시가 캔들에서 MACD 막대는 0 또는 = 0 아래에서 열립니다) – 그러면 모든 것이 재설정됩니다. 신호는 연속으로 4개의 양초를 열 수 있는 테스트를 통과하지 못했습니다 .

pliz, 숙련된 프로그래머, 이러한 조건을 충족하려면 코드에서 무엇을 변경해야 합니까? 그리고 나는 많은 것을 시도했고 일반적으로 xs ...

 
   if (malw>mas1 && malw>mas2  && OrderSell)

속담처럼 액면 그대로 받아들이지 마십시오.

 OrderSell

xs에 무엇이 포함될 수 있는지, 코드에서 의사 결정 논리를 분리하십시오.

 

artem artem # :

1. 첫 번째 캔들의 시가 - (5) (75) 및 (85) + MACD 바가 0 이상 - 확인 4개 중 1개 ;

2. 두 번째 캔들 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4개 중 2개의 확인이 ;

3. 3번째 캔들의 시가 - (5) (75), (85) + MACD 바 0 이상 시가 -   4건 중 3건은 ;

4. 4번째 캔들 시가 - (5) (75), (85) + MACD 0선 상회 -   4개 중 4개 확인    같은 양초(4일)에 매수할 거래를 엽니다.

     //+------------------------------------------------------------------+
    //| 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);
      }
     
    malw

    하나의 가치를 망치고 - 다른 하나, 아무것도? 첫 번째 블록 = 솔루션, 두 번째 블록 = 솔루션, 블록 비교를 나눕니다.

     
    Volodymyr Zubov # :

    하나의 가치를 망치고 - 다른 하나, 아무것도? 첫 번째 블록 = 솔루션, 두 번째 블록 = 솔루션, 블록 비교를 나눕니다.

    누구에게 쓰여졌습니까? 또는 무엇에?
     
    그것은 당신에게 밝혀졌습니다. 코드에는
    malw
    논리적 오류가 있습니다.
     
    Volodymyr Zubov # :
    코드에 논리적 오류가 있다는 것이 밝혀졌습니다.
    게시하기 전에 확인
     

    좋아, 하지만 변수를 그렇게 사용하면 변수가 충돌하고 "기적"이 무엇인지 이해하지 못할 것입니다.

     
    Volodymyr Zubov # :

    좋아, 하지만 변수를 그렇게 사용하면 변수가 충돌하고 "기적"이 무엇인지 이해하지 못할 것입니다.

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

    사람들을 도우십시오)