백 테스트 시 EA가 계속 마이너스 이익을 내는 이유는 무엇입니까? - 페이지 3

 
deVries :

Metatrader를 시작할 때 EA는 거래가 열려 있는지 확인해야 합니다.

거래가 있는 경우 거래를 확인하기 위해 카운트다운 루프만 수행합니다.

처음에 하나를 설정하고 OrdersTotal() >0으로 설정하면 if(.......> || .......> ){루프를 수행합니다....

위에 표시된 결과를 제공하는 코드를 나에게 주었다고 확신합니까? 나는 1440 (1 DAY) 기간에 그것을 테스트했으며 거래가 실행되지 않았습니다. 그러나 1M으로 변경하면 많은 거래가 실행되었습니다.
 
cyxstudio :
위에 표시된 결과를 제공하는 코드를 나에게 주었다고 확신합니까? 나는 1440 (1 DAY) 기간에 그것을 테스트했으며 거래가 실행되지 않았습니다. 그러나 1M으로 변경하면 많은 거래가 실행되었습니다.
내 테스트를 다시 확인 하면 테스트 기간과 테스트 기간을 찾을 수 있습니다.
 

알겠습니다. 할 수 있으면 여기에서 돕겠습니다.

이 Ma_Shift 질문은 내가 언젠가는 가지고 있었지만 명확한 대답을 얻을 수 없었던 것입니다.

코드에서 이동 평균에서 8의 이동을 사용하고 있음을 알 수 있다면.... 이것이 의미하는 바는 무엇입니까?

 MA200 = iMA(NULL, 0, 200, 8 , MODE_SMA,PRICE_CLOSE, 0);
MA5 = iMA(NULL, 0, 5, 8 , MODE_SMA,PRICE_CLOSE, 0);
CurrentRSI = iRSI(NULL, 0, VarPeriod,PRICE_CLOSE,0);
 보시다시피 이 시프트 설정은 RSI에 존재하지 않습니다 ... 자체 창에 표시됩니다. 이것이 단서입니다.
 차트에 이동 평균을 놓으면 Shift 상자의 설정으로 Ma_Shift와 동일한 것을 볼 수 있습니다.
 또한 매개변수 200,8,sma,close의 순서 를 확인하십시오. 표시기를 호출할 때와 동일합니다.
 상자에 나열된 순서대로 ... NULL 및 시간 프레임은 Ma를 삭제하는 것입니다.
 그래서 그들은 여기에 필요하지 않습니다. 마지막 교대 설정도 아닙니다... 이 ma는 지속적으로 변경됩니다.
 현재 촛불 .... 당신은 이것을 곧 이해하게 될 것입니다. 
 iAlligator 표시기 설정을 보면 턱 이동, 치아 이동 및 입술 이동에 대한 설정이 표시됩니다. 이것은 각 이동 평균의 MaShift입니다.
 원하는 막대의 수만큼 차트에서 왼쪽이나 오른쪽으로 모두 이동할 수 있습니다. 

이렇게 표시됩니다.............

 

이것은 데이터 창에 표시된 것처럼 이 08:00 양초의 값에 3핍 차이를 만듭니다.

이것은 우리에게 질문을 가져다줍니다. 마지막에 "Shift" 설정은 무엇을 위한 것입니까?

데이터 창을 연 상태에서 차트 위로 마우스를 이동하고 양초에서 양초로 이동하면

양초에서 양초로 이동함에 따라 5 SMA의 숫자가 변경되는 것을 볼 수 있습니다.

그것이 마지막 SHIFT 값에 관한 것입니다 ... 현재 촛불이

그린은 양초 0입니다... 마지막으로 완성된 양초는 양초 1이므로 총 1000개의 양초가 켜져 있는 경우

차트 왼쪽 가장자리의 999부터 0까지 거꾸로 번호가 매겨져 있습니다.

현재 있습니다. 그래서 5개의 SMA의 가치가 5개의 완성된 양초 전에 무엇인지 알고 싶다면

당신은 마지막 자리에 5를 넣습니다... 물론 시간이 지남에 따라... 초 5는 다음 초로 바뀝니다.

이제 언급했듯이 .. 항상 양초 0의 값을 얻는 경우 해당 값은 지속적으로

가격으로 변경합니다. 따라서 신호를 받으면 표시기가 다시 표시됩니다.

항상 촛불 1에서 정보를 요청하면 완료되었으며 변경되지 않습니다....

이게 도움이 되길 바란다...

 
cyxstudio :

모든 것을 다시 실행하고 루프, 미끄러짐, 이동 평균 및 RSI 값을 수정하고 새 위치를 시작하기 전에 열려 있는 모든 위치를 닫았는지 확인했습니다. 하지만 백테스트를 해도 아무 일도 일어나지 않고, 매수/매도도 실행되지 않았습니다... 다시 문제가 무엇입니까?



init() 함수는 시작할 때만 실행되고 start() 함수와 같은 모든 틱 에는 실행되지 않습니다. 작동하려면 init() 대신 시작 함수에 이동 평균을 다시 넣어야 합니다. 계속 새로운 수치가 나오네요...
 

재작업

EA가 새 위치를 열기로 결정하기 전에 보류 중인 주문 이 있는지 확인하는 기능을 추가하십시오. 보류 중이거나 열린 주문이 있으면 더 이상 열려고 시도하지 않습니다.at

나는 모든 사람들이 루프를 사용하여 구매하기 전에 오픈 포지션이 있는지 확인하는 것을 봅니다. 나는 그 논리를 볼 수 없습니다. OrdersTotal이 > 0인 한 열린 주문이 있고 내 EA는 더 많은 포지션을 열지 않을 것입니다.

감소 루프를 수정했습니다.

이번에는 refreshrates()를 추가하여 해결할 수 없는 OrderClose 오류 138이 발생합니다.

그리고 나는 여전히 버려서는 안 될 돈을 잃게 됩니다.

나는 고칠 다른 것을 생각할 수 없다 ...

 //+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"


extern int RSIPeriod        =   3 ;       //number of periods for RSI
extern double UpperBound    =   90 ;     //set upper bound value for RSI
extern double LowerBound    =   5 ;       //set lower bound value for RSI
extern int MASlowPeriod     = 200 ;
extern int MAFastPeriod     = 5 ;
extern double Lots  = 0.1 ;
extern double StopLoss      = 60 ;       //Set the stop loss level
extern double TakeProfit    = 120 ;       //Set the take profit level
extern double TrailingStop = 40 ;
//extra settings for OrderSend
extern int         MagicNumber = 54333 ;
extern string      CommentEA = "RSI strategy" ;
extern int         Slippage.Pips    = 3 ;


int     BUYS= 1 ,SELLS= 1 ;
//++++ These are adjusted for 5 digit brokers.
int      pips2points;       // slippage  3 pips    3=points    30=points
double   pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int      Digits .pips;       // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if ( Digits % 2 == 1 )   // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point * 10 ; pips2points = 10 ;   Digits .pips = 1 ;}
     else {pips2dbl = Point ;    pips2points =   1 ;   Digits .pips = 0 ;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl        
//----      

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
   
   double pAsk = MarketInfo( Symbol (), MODE_ASK);
   double pBid = MarketInfo( Symbol (), MODE_BID);
   double MA200 = iMA ( NULL , 0 , MASlowPeriod, 0 , MODE_SMA , PRICE_CLOSE , 0 );   //200 day Moving Average   
   double MA5 = iMA ( NULL , 0 , MAFastPeriod, 0 , MODE_SMA , PRICE_CLOSE , 0 );       //  5 day Moving Average
   double CurrentRSI = iRSI ( NULL , 1440 , RSIPeriod, PRICE_CLOSE , 0 );
  
   int Ticket2;
   int cnt;
   
   if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
   
   if (AccountFreeMargin()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }


  
        
        
         if ( OrdersTotal () == 0 ) {
        
         if (CurrentRSI < LowerBound && pAsk > MA200) {     //Condition to execute buy entry
  
        Ticket = OrderSend ( Symbol (), OP_BUY, Lots, pAsk, 3 , pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy." , 111 , 0 ,Yellow)   ;       //execute buy order
   
     if (Ticket> 0 )
           {
             if ( OrderSelect (Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print ( "BUY order opened : " ,OrderOpenPrice());
            
           }
         if (Ticket < 0 ) {
         Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
   }
  
  }
  
  
 
   if (CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend ( Symbol (), OP_SELL, Lots, pBid, 3 , pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell." , 000 , 0 , Yellow)  ;     //execute sell order
       if (Ticket2> 0 )
           {
             if ( OrderSelect (Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print ( "SELL order opened : " ,OrderOpenPrice());
           
           }
         if (Ticket2< 0 ) {
           Print ( "Error opening SELL order : " , GetLastError ()); 
         return ( 0 ); 
        }
      
   
   } 
   }
   
   if ( OrdersTotal () > 0 ) {
   
   int PositionIndex;     //  <-- this variable is the index used for the loop

int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool

TotalNumberOfOrders = OrdersTotal ();     // <-- we store the number of Orders in the variable

for (PositionIndex = TotalNumberOfOrders - 1 ; PositionIndex >= 0 ; PositionIndex --)   //  <-- for loop to loop through all Orders . .   COUNT DOWN TO ZERO !
   {
   RefreshRates();
   if ( ! OrderSelect (PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue ;   // <-- if the OrderSelect fails advance the loop to the next PositionIndex
   
   if ( OrderMagicNumber() == MagicNo       // <-- does the Order's Magic Number match our EA's magic number ? 
      && OrderSymbol() == Symbol ()         // <-- does the Order's Symbol match the Symbol our EA is working on ? 
      && ( OrderType() == OP_BUY           // <-- is the Order a Buy Order ? 
      ||   OrderType() == OP_SELL ) )       // <-- or is it a Sell Order ?
   
   if (pAsk > MA5){       //condition to close long position
   RefreshRates();
    OrderClose(OrderTicket(),OrderLots(),pBid, 3 ,Violet); // close long position
 
   return ( 0 ); // exit
   
   if (TrailingStop> 0 )  
              {                 
               if (pBid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (OrderStopLoss()<pBid- Point *TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pBid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green);
                     return ( 0 );
                    }
                 }
              }
   
  }
   
   if (pBid < MA5){       //condition to close short position
   RefreshRates();
   OrderClose(OrderTicket(),OrderLots(),pAsk, 3 ,Violet); // close short position
  
   return ( 0 ); // exit
   
   
   if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-pAsk)>( Point *TrailingStop))
                 {
                   if ((OrderStopLoss()>(pAsk+ Point *TrailingStop)) || (OrderStopLoss()== 0 ))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),pAsk+ Point *TrailingStop,OrderTakeProfit(), 0 ,Red);
                     return ( 0 );
                    }
                 }
              }
   }
   
       if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), Slippage ) )               // <-- try to close the order
         Print ( "Order Close failed, order number: " , OrderTicket(), " Error: " , GetLastError () );   // <-- if the Order Close failed print some helpful information 
      
   } //  end of For loop
   
   
   }
  
   
   
   
   
   
        
        
           return ( 0 );
}
 
cyxstudio :

재작업

EA가 새 위치를 열기로 결정하기 전에 보류 중인 주문이 있는지 확인하는 기능을 추가하십시오. 보류 중이거나 열린 주문이 있으면 더 이상 열려고 시도하지 않습니다.at

나는 모든 사람들이 루프를 사용하여 구매하기 전에 오픈 포지션이 있는지 확인하는 것을 봅니다. 나는 그 논리를 볼 수 없습니다. OrdersTotal이 > 0인 한 열린 주문이 있고 내 EA는 더 많은 포지션을 열지 않을 것입니다.

감소 루프를 수정했습니다.

이번에는 refreshrates()를 추가하여 해결할 수 없는 OrderClose 오류 138이 발생합니다.

그리고 나는 여전히 버려서는 안 될 돈을 잃게 됩니다.

나는 고칠 다른 것을 생각할 수 없다 ...

귀하의 EA가 귀하의 계정에서 개설한 거래를 확인 하기 전에 구매를 여는 논리를 배치한 이유는 ????

이제 어떻게 될까요???? 당신이 지금까지 가지고있는 프로그래밍으로 ???

EA에서 실행 중인 계정이 있다고 가정합니다. GBPUSD에 대한 거래를 수동으로 엽니다.

해당 거래에서 OrdersTotal()은 얼마나 많은 거래를 합니까 ???

귀하의 코드.... 구매

 if (AccountFreeMargin()<( 1000 *Lots))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }


  
        
        
         if ( OrdersTotal () == 0 ) {
        
         if (CurrentRSI < LowerBound && pAsk > MA200) {     //Condition to execute buy entry
  
        Ticket = OrderSend ( Symbol (), OP_BUY, Lots, pAsk, 3 , pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy." , 111 , 0 ,Yellow)   ;       //execute buy order
   
     if (Ticket> 0 )
           {
             if ( OrderSelect (Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print ( "BUY order opened : " ,OrderOpenPrice());
            
           }
         if (Ticket < 0 ) {
         Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
   }
  

이게 지금 뭐하는거야??? 그리고 무엇 때문에 그렇게 하고 있습니까 ???

 
deVries :

귀하의 EA가 귀하의 계정에서 개설한 거래를 확인하기 전에 구매를 여는 논리를 배치한 이유는 ????

이제 어떻게 될까요???? 당신이 지금까지 가지고있는 프로그래밍으로 ???

EA에서 실행 중인 계정이 있다고 가정합니다. GBPUSD에 대한 거래를 수동으로 엽니다.

해당 거래에서 OrdersTotal()은 얼마나 많은 거래를 합니까 ???

귀하의 코드.... 구매

이게 지금 뭐하는거야??? 그리고 무엇 때문에 그렇게 하고 있습니까 ???


매수 조건이 충족되고 개설된 포지션이 없는 경우에만 매수
 
cyxstudio :

매수 조건이 충족되고 개설된 포지션이 없는 경우에만 매수

EA에서 실행 중인 계정이 있다고 가정합니다. GBPUSD에 대한 거래를 수동으로 엽니다.

조건이 사실이 될 것인가

 if ( OrdersTotal () == 0 )
 
cyxstudio 2013.01.31 18:04

귀하의 코드를 살펴보도록 하시겠습니까?

나는 내가 왜 실패했고 그것을 올바르게 얻는 방법을 알고 싶지 않습니다.

.

나에게 메시지를 보내면 전체 코드를 직접 줄 수 있습니다 .....

그것은 무료가 아닙니다. 그러려면 작업 섹션을 사용하고 비용을 지불해야 합니다...

그러면 거기에서 얻을 것이다.

.

또 다른 방법은 주제를 잘 읽는 것입니다.

여기에서 직접 프로그래밍하는 방법을 배울 수 있도록 도와드립니다. 무료 도움말입니다.

우리는 당신에게 당신의 오류를 보여주고 해결 방법을 안내합니다.

작성법을 터득한 순간 가지고 있는 코드를 보여줍니다....

지불할 필요가 없으며 그 순간에 이 포럼의 도움으로 여기에서 만든 코드와 비교할 수 있습니다.

....

내 마지막 질문은 여전히 답이되지 않았습니다

EA에서 실행 중인 계정이 있다고 가정합니다. GBPUSD에 대한 거래를 수동으로 엽니다.

조건이 사실이 될 것인가

 if ( OrdersTotal () == 0 )

.

. 다른 주제 에서 OrderClose 오류 138

당신은 거기에서 아주 잘 도왔습니다( RaptorUK 와 WHRoeder 는 거기에 대한 설명에 감사드립니다.

.

내가 당신에게 가지고있는 또 다른 질문은

이 이동 평균 계산에서 기간을 변경한 이유는

 

   double MA200 = iMA ( NULL , 0 , MASlowPeriod, 0 , MODE_SMA , PRICE_CLOSE , 0 );   //200 day Moving Average   
   double MA5 = iMA ( NULL , 0 , MAFastPeriod, 0 , MODE_SMA , PRICE_CLOSE , 0 );       //  5 day Moving Average

이것은 내가 준 것과 같지 않고,

다른 차트에서 올바른 값을 계산하지 않습니다. Daily

.

따라서 시간을 내어 학습하고 연습하고 이 포럼에서 얻을 수 있는 도움말을 주의 깊게 읽으십시오.

또는 다음과 같은 사이트에서 프로그래밍할 사람에게 비용을 지불합니다.   채용정보  

 
deVries :
cyxstudio 2013.01.31 18:04

귀하의 코드를 살펴보도록 하시겠습니까?

나는 내가 왜 실패했고 그것을 올바르게 얻는 방법을 알고 싶지 않습니다.

.

나에게 메시지를 보내면 전체 코드를 직접 줄 수 있습니다 .....

그것은 무료가 아닙니다. 그러려면 작업 섹션을 사용하고 비용을 지불해야 합니다...

그러면 거기에서 얻을 것이다.

.

또 다른 방법은 주제를 잘 읽는 것입니다.

여기에서 직접 프로그래밍하는 방법을 배울 수 있도록 도와드립니다. 무료 도움말입니다.

우리는 당신에게 당신의 오류를 보여주고 해결 방법을 안내합니다.

작성법을 터득한 순간 가지고 있는 코드를 보여줍니다....

지불할 필요가 없으며 그 순간에 이 포럼의 도움으로 여기에서 만든 코드와 비교할 수 있습니다.

....

내 마지막 질문은 여전히 답이되지 않았습니다

EA에서 실행 중인 계정이 있다고 가정합니다. GBPUSD에 대한 거래를 수동으로 엽니다.

조건이 사실이 될 것인가

.

. 다른 주제 에서 OrderClose 오류 138

당신은 거기에서 아주 잘 도왔습니다( RaptorUK 와 WHRoeder 는 거기에 대한 설명에 감사드립니다.

.

내가 당신에게 가지고있는 또 다른 질문은

이 이동 평균 계산에서 기간을 변경한 이유는

 

이것은 내가 준 것과 같지 않고,

다른 차트에서 올바른 값을 계산하지 않습니다. Daily

.

따라서 시간을 내어 학습하고 연습하고 이 포럼에서 얻을 수 있는 도움말을 주의 깊게 읽으십시오.

또는 다음과 같은 사이트에서 프로그래밍할 사람에게 비용을 지불합니다.   채용정보  

OrdersTotal ()은 EA 또는 매뉴얼을 통해 개설된 것과 상관없이 보류 중인 주문 및 시장 주문의 총 금액을 표시한다고 가정합니까?

이런 생각을 하고 있었습니다. 내 EA는 항상 미결 주문이 있는지 확인하고 있을 경우 더 이상 주문을 열지 않으며 미결 주문이 없을 때만 새 주문을 엽니다.

 if ( OrdersTotal () == 0 )

내 결과 섹션에 1,1,2,2,3,3,4,4 주문 시퀀스가 표시되기 때문에 제대로 작동한다고 생각합니다. 이는 새 주문이 열리기 전에 주문이 마감되었음을 의미합니다.

이동 평균 및 RSI에 대한 변수는 테스트 이유로 인해 변경되었습니다. 다른 시간 프레임/기간에 실험하고 있었지만 여기에 게시할 때 다시 변경하지 않았습니다.

그리고 가장 기이한 것은 내 코드가 구매 주문만 실행한다는 것입니다. 단 한 번도... 매도 주문을 실행한 적이 없습니다. 그냥 이상해,

요컨대, 내가 지금 직면하고 있는 문제들.

1. 매수만 실행하고 매도를 코딩했음에도 불구하고 매도를 실행하지 않습니다.

2. 나는 이 전략이 가정하지 않을 것이라고 확신하는 여전히 마이너스 이익을 내고 있습니다.

사유: