작은 도움?

 

그래서 저는 몇 가지 다른 언어를 배운 후 mql4를 배우고 있으며, 단순한 이동 평균 거래자인 제 첫 번째 EA의 첫 번째 버전을 막 마쳤습니다. 나는 걱정 없이 어제 내내 그것을 실행하도록 두었다. 입구와 출구는 예상대로였고, 갈 준비가 되었다고 생각했습니다. 오늘 아침에 여러 가지 문제가 발생했습니다. 먼저 코드를 다시 실행하면 위치에 관계없이 판매만 하다가 이제 약간의 만지작거리면 올바른 위치에서 사고 팔 수 있지만 구매하면 거래가 닫힙니다. 상관없이 다음 틱에. 이것은 동일한 형식을 유지하면서도 판매할 때 발생하지 않습니다. 누군가 나에게 그 이유를 알려줄 수 있습니까?

(참고로 내 컴퓨터는 어제 하루 종일 코드를 실행할 수 있었습니다(CPU 평균 12%). 오늘은 코드를 실행하는 지옥의 종소리처럼(~60-90%))

암호:

 int total;
//+------------------------------------------------------------------+
//| expert init function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total= 0 ;
   if ( OrdersTotal ()== 0 )
      {
      total= OrdersTotal ();
   }
   else 
      {
       for (i= 1 ; i<= OrdersTotal (); i++)                                                       //--- counter for any trades open on the pair
         {
         if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true )
            {
             if (OrderSymbol()== Symbol ())
               {
               if ((OrderType()==OP_BUY)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }
   }
}
//----
   return ;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return ( 0 );
}
//+------------------------------------------------------------------+
//| expert start function                                   |
//+------------------------------------------------------------------+
int start()
  {
//----
   int p,q,z,i,L;
   while (AccountBalance()> 50 )                                                                                     //---- ensures an infinite loop for 1 trade a run 
   {                                                                                                               //---- (no infibuying!) (*) but always run
//---- 
RefreshRates();
//----
if (( iRSI ( Symbol (), PERIOD_D1 , 14 , PRICE_CLOSE , 0 )< 70 )&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 ))&&(total== 0 ))
      {                                                                                                                             //---------- ^ conditions to buy
      p= OrderSend ( Symbol (),OP_BUY, 0.1 ,Bid, 0 , 0 , 0 , "" ,z, 0 ,Red);                                                                        //---------- Buy Order
      OrderSelect (p,SELECT_BY_TICKET);
         while ( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 ))                             //- whilst the above remains true
            {
            RefreshRates();                                                                                                         //- refresh then do nothing
             Sleep ( 1000 );
         }
      OrderClose(OrderTicket(), 0.1 ,OrderClosePrice(), 0 ,Green);                                                                      //---when above is broken, close
         while (TimeSeconds( TimeCurrent ())!= 0 )                                                                                       //---wait until a new minute
            {
             Sleep ( 1000 );
         }
         continue ;
      }
//-----         
if (( iRSI ( Symbol (), PERIOD_D1 , 14 , PRICE_CLOSE , 0 )> 30 )&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 ))&&(total== 0 ))
       {                                                                                                                             //---Same steps as above for sell
       q= OrderSend ( Symbol (),OP_SELL, 0.1 ,Ask, 0 , 0 , 0 , "" ,z, 0 ,Blue);
       OrderSelect (q,SELECT_BY_TICKET);
         while ( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 ))
            {
            RefreshRates();
             Sleep ( 1000 );
         }
      OrderClose(OrderTicket(), 0.1 ,OrderClosePrice(), 0 ,Green);
         while (TimeSeconds( TimeCurrent ())!= 0 )
            {
             Sleep ( 1000 );
         }      
         continue ;
      }
if (total!= 0 )
   {
   L= 0 ;
   for (i= 1 ; i<= OrdersTotal (); i++)                                                       //--- if trades were open which werent initially closed
         {
         if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true )
            {
             if (OrderSymbol()== Symbol ())
               {
               if ((OrderType()==OP_BUY)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- close them if now the position has change
               }
               if ((OrderType()==OP_SELL)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- same with sell
               }
               else 
                  {
                  L++;
               }
            }
            total=L;
         }
      }
   }
else 
   {
   Sleep ( 1000 );
} 
}
//----
return ;
}
//--------------------------------------------------------------+
 

나는 당신의 코드에 너무 깊이 들어가지 않았습니다

왜 RefreshRates 그리고 나서 1초 동안 휴면하는가, 시장이 빠르게 움직일, 데이터는 오래될 것입니다!?

막대가 아닌 틱을 기준으로 계산하므로 1개의 틱은 한 MA가 최소량만큼 다른 MA 위/아래로 이동하여 주문을 트리거할 수 있습니다. 다음 틱(수면 후)이 반전되면 MA가 다시 교차하고 주문이 닫힙니다.

 

아이디어는 닫기 조건이 발생할 때까지 조건이 대기하는 동안(일명 sma의 전환) while 루프를 유지하는 것입니다. 물론 가장 좋은 방법은 아니지만 계산상 가장 저렴한 방법 중 하나입니다.

SMA가 서로 위/아래로 빠르게 움직이는 것은 코드의 문제 중 하나입니다. 하지만 현재 실행 중인 두 핍 사이에 10 - 15핍이 있으면 닫힐 이유가 없습니다. 조건은 while 루프가 즉시 닫히지 않고 제어 상태를 유지하도록 확실히 유지됩니다(내 가정은 while 루프가 매수에 대해서는 무시되지만 매도에는 무시된다는 것입니다. 그리고 나는 이유를 모르겠습니다)

 
jwmsb :

아이디어는 닫기 조건이 발생할 때까지 조건이 대기하는 동안(일명 sma의 전환) while 루프를 유지하는 것입니다. 물론 가장 좋은 방법은 아니지만 계산상 가장 저렴한 방법 중 하나입니다.

SMA가 서로 위/아래로 빠르게 움직이는 것은 코드의 문제 중 하나입니다. 하지만 현재 실행 중인 두 핍 사이에 10 - 15핍이 있으면 닫힐 이유가 없습니다. 조건은 즉시 닫기로 점프하는 대신 while 루프가 제어 상태를 유지하도록 확실히 유지됩니다(내 가정은 while 루프가 매수에 대해서는 무시되지만 매도에는 무시된다는 것입니다. 그리고 나는 이유를 모르겠습니다)


한 MA가 다른 MA보다 높거나 낮은지 여부만 확인 하는 경우 일반적으로 10~15핍 차이인지 의심스럽습니다. 0.1핍이 될 수 있으므로 다음 틱이 쉽게 되돌릴 수 있습니다.

제 생각일 뿐입니다만, 크로스오버로 작업할 때 반대 신호가 너무 많이 발생하지 않도록 닫힌 막대에서만 계산하는 것이 가장 좋다고 생각합니다.

 

또한 귀하의 초기화에서

 int i;
   total= 0 ;
   if ( OrdersTotal ()== 0 )
      {
      total= OrdersTotal ();
   }
   else 
      {
       for (i= 1 ; i<= OrdersTotal (); i++)                                                       //--- counter for any trades open on the pair
         {
         if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true )
            {
             if (OrderSymbol()== Symbol ())
               {
               if ((OrderType()==OP_BUY)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }
   }
}

귀하의 else는 마지막 경우에만 적용되므로 EA가 공개 판매 주문 을 마감하지 않으면 총계가 1만큼 증가합니다. 왜 이것을 원하십니까?

 
GumRai :


한 MA가 다른 MA보다 높거나 낮은지 여부만 확인하는 경우 일반적으로 10~15핍 차이인지 의심스럽습니다. 0.1핍이 될 수 있으므로 다음 틱이 쉽게 되돌릴 수 있습니다.

제 생각일 뿐입니다만, 크로스오버로 작업할 때 반대 신호가 너무 많이 발생하지 않도록 닫힌 막대에서만 계산하는 것이 가장 좋다고 생각합니다.


핍의 관점에서 내 부분에 오산이었다! 내 잘못이야! 그러나 요점은 이 둘 사이에 숨을 쉴 수 있는 공간이 있으므로 매도를 강요하는 교차 신호가 없다는 것입니다. Sleep(1000)을 while (TimeSecond(TimeCurrent)!=59) {Sleep(1000)}으로 교체하면 촛불을 닫을 때만 크로스오버 테스트를 보장할 수 있습니까?


나는 구매 섹션에서 OrderClose를 꺼냈고 주문은 실행될 때 여전히 열리고 다음 pip에서 닫힙니다.


다음으로 OP_BUY 및 OP_SELL을 전환했으며 6SMA가 21SMA를 초과할 때 예상대로 판매가 유지됩니다. 어떤 일이 발생하는지 확인하기 위해 다음 교차를 기다리고 있습니다(분명히 당분간 이것을 테스트하고 있습니다)

 

바꿔야 할 것이 많다..... 해야 할 일

거래에서 EA가 생성하는 매직넘버는 무엇입니까?

고유한 숫자로 만들 수 있고 다른 EA의 거래를 마감하지 않도록 외부 입력 변수로 만들지 않겠습니까?

 int init()
  {

//---- 
   int i;
   total= 0 ;
   if ( OrdersTotal ()== 0 )
      {
      total= OrdersTotal ();
   }

여기서 무슨 일이...

       for (i= 1 ; i<= OrdersTotal (); i++)                                                        //--- counter for any trades open on the pair

         {
         if ( OrderSelect (i- 1 ,SELECT_BY_POS)== true )
            {
             if (OrderSymbol()== Symbol ())
               {
               if ((OrderType()==OP_BUY)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  { 
                   OrderClose( OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- with an open buy if the conditions have reversed close on initiation
               }
               if ((OrderType()==OP_SELL)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                  {
                   OrderClose(O rderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                   //--- same with sell
               }
               else 
                  {
                  total++;                                                                   //--- if there are open trades yet to be completed add to tally (*)
               }
           }
       }

거래 확인을 세지 마십시오. 지금처럼 루프 내부에서 거래를 닫으면 실패합니다.

일을 해야 하는 이유와 카운트다운 방법을 보려면 여기를 살펴보세요.

https://www.mql5.com/en/forum/139654

( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )

이 조건은 스프레드를 지불하는 모든 거래에 새로운 틱이 올 때 몇 분 안에 여러 번 변경될 수 있습니다.

조건이 항상 한 번 변경되는 것은 아닙니다....단일 막대에서

   while (AccountBalance()> 50 )                                                                                     //---- ensures an infinite loop for 1 trade a run 
   {                                                                                                               //---- (no infibuying!) (*) but always run
//---- 

항상 실행하는 것은 당신을 잠들게합니다

틱이 완료되고 새 틱이 올 때 일반적인 방법으로 start()가 다시 호출됩니다.

     while (TimeSeconds( TimeCurrent ())!= 0 )                                                                                       //---wait until a new minute
            {
             Sleep ( 1000 );
         }
         continue ;
      }

이 방법은 초가 0일 때만 코드를 실행하면 자주 실패합니다.

순간적으로 새로운 진드기가 들어오지 않는 일이 자주 발생할 수 있기 때문에

분의 첫 번째 틱이 1초에 오면 새로운 분을 기다려야 하고 다음 분 0초에 새 틱이 오기를 바랍니다.

Refres hRates() 함수를 확인하십시오.

4 및 5 자리 중개인뿐만 아니라 작동하도록 만드는 것과 같은 더 많은 것들이 있습니다.

리턴코드 확인 중....

당신의 가치를 0으로 바꾸세요 왜 필요한가요 ??? 더 크게 하기 위해

 
deVries :

바꿔야 할 것이 많다..... 해야 할 일

거래에서 EA가 생성하는 매직넘버는 무엇입니까?

고유한 숫자로 만들 수 있고 다른 EA의 거래를 마감하지 않도록 외부 입력 변수로 만들지 않겠습니까?

여기서 무슨 일이...

거래 확인을 세지 마십시오. 지금처럼 루프 내부에서 거래를 닫으면 실패합니다.

일을 해야 하는 이유와 카운트다운 방법을 보려면 여기를 살펴보세요.

https://www.mql5.com/en/forum/139654

이 조건은 스프레드를 지불하는 모든 거래에 새로운 틱이 올 때 몇 분 안에 여러 번 변경될 수 있습니다.

조건이 항상 한 번 변경되는 것은 아닙니다....단일 막대에서

항상 실행하는 것은 당신을 잠들게합니다

틱이 완료되고 새 틱이 올 때 일반적인 방법으로 start()가 다시 호출됩니다.

이 방법은 초가 0일 때만 코드를 실행하면 자주 실패합니다.

순간적으로 새로운 진드기가 들어오지 않는 일이 종종 발생할 수 있기 때문에

분의 첫 번째 틱이 1초에 오면 새로운 분을 기다려야 하고 다음 분 0초에 새 틱이 오기를 바랍니다.

Refres hRates() 함수를 확인하십시오.

4 및 5 자리 중개인뿐만 아니라 작동하도록 만드는 것과 같은 더 많은 것들이 있습니다.

리턴코드 확인 중....

당신의 가치를 0으로 바꾸세요 왜 필요한가요 ??? 더 크게 하기 위해

도와주셔서 감사합니다. 지금 변경 중이며 어떻게 진행되는지 지켜보겠습니다! 어리석은 실수가 나를 대신하여 어리석은 실수를 더했습니다! 처음에 실행한 이유가 거의 궁금합니다!
 

그래서 가장 단순한 기능(예: 크로스오버 = 역포지션)에서 실행하도록 코드를 제거했습니다. 두 SMA가 가까울 때 많은 매수/매도 주문을 유발하지만 (지금은) 그것에 대해 걱정하지 않고 잘 실행됩니다. 데모 계정에서. 지금 저와 관련된 것은 Strategy Tester 에서 코드를 실행하면 첫 번째 위치가 올바르게 열리지만 시간적으로 앞으로 나아가지 못하므로 SMA가 절대 교차하지 않는다는 것입니다. 내가 무엇을 잘못하고 있지? 내 인쇄 목록은 다음과 같습니다.

2013.10.22 23:41:26 2013.09.18 00:41 테스터: 1번 주문 마감

2013.10.22 23:41:26 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

...

2013.10.22 23:40:53 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:40:52 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:40:51 2013.09.18 00:41 SMACode3 GBPJPY,M1: 0

2013.10.22 23:56:18 SMACode3 GBPJPY,M1: 성공적으로 로드됨

암호:



 //+------------------------------------------------------------------+
//|                                                   SMA scripy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"
extern int z= 1234 ;
int total;
//----

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total= 0 ;
   if ( OrdersTotal ()!= 0 )
      {
       for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)                                                     
         {
         if ( OrderSelect (i,SELECT_BY_POS))
            {
             if (OrderSymbol()== Symbol ())
               {
               if (OrderMagicNumber()==z) 
                  {
                   if ((OrderType()==OP_BUY)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )< iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                     { 
                     OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                  
                  }
                   if ((OrderType()==OP_SELL)&&( iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 )> iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 )))
                     {
                     OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                  
                  }
                   else 
                     {
                     total++;                                                                 
                  }
               }
           }
       }
   }
}
//----
   return ;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return ( 0 );
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
//----
   int i,L;
   while (AccountBalance()> 50 )                                                                                     
   {
   RefreshRates();
//-----
double SMA6= iMA ( Symbol (), 0 , 6 , 0 , MODE_SMA , PRICE_CLOSE , 0 );
double SMA21= iMA ( Symbol (), 0 , 21 , 0 , MODE_SMA , PRICE_CLOSE , 0 );
double RSI70= iRSI ( Symbol (), PERIOD_D1 , 14 , PRICE_CLOSE , 0 )< 70 ;
double RSI30= iRSI ( Symbol (), PERIOD_D1 , 14 , PRICE_CLOSE , 0 )> 30 ;                                                                                                            
//-----   
if (IsTesting()== true )
{
Sleep ( 60000 );
Print ( GetLastError ());
}
//----
   if (total== 0 )
      {
       if ((RSI70)&&(SMA6>SMA21))
         {                                                                                                                       
         OrderSend ( Symbol (),OP_BUY, 0.1 ,Ask, 0 , 0 , 0 , "" ,z, 0 ,Red); 
         total+= 1 ;                                                       
         continue ;
      }
       if ((RSI30)&&(SMA6<SMA21))
         {
         OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 0 , 0 , 0 , "" ,z, 0 ,Blue);
         total+= 1 ;
         continue ;
      }  
   }
//---
if (total!= 0 )
   {
   L= 0 ;
   for (i= OrdersTotal ()- 1 ; i>= 0 ; i--)                                                    
      {
       if ( OrderSelect (i,SELECT_BY_POS))
         {
         if (OrderSymbol()== Symbol ())
            {
             if (OrderMagicNumber()==z) 
               {
               if ((OrderType()==OP_BUY)&&(SMA6<SMA21))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);
                     total+=- 1 ;
                 return ;
               }
               if ((OrderType()==OP_SELL)&&(SMA6>SMA21))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);                 
                     total+=- 1 ;
                   return ;
               }
               else 
                  {
                  L++;                                                                  
               }
            }
            total=L;
         }
      }
   }
}
//----
}
//----
return ;
}
//--------------------------------------------------------------+
 
jwmsb : 지금 내가 걱정하는 것은 Strategy Tester에서 내 코드를 실행하면 첫 번째 위치가 올바르게 열리지만 시간이 지나면서 앞으로 나아가지 못한다는 것입니다.
  1.  int start(){
       while (AccountBalance()> 50 ){
          :
    당연히 아니지. RTFM. 처음부터 돌아올 때만 새 틱을 받습니다.
  2.  if (IsTesting()== true ){
         Sleep ( 60000 );
         Print ( GetLastError ());
    }
    RTFM 및 테스터 제한 테스터에서 잠을 잘 수 없습니다
  3.          OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 0 , 0 , 0 , "" ,z, 0 ,Blue);
                      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 0 ,Green);
    
    함수 반환 값이란 무엇입니까? 어떻게 사용합니까? - MQL4 포럼
 
RefreshRates는 테스터의 값을 변경하지 않으므로 작업할 새 값이 없기 때문에 while 루프에 갇히게 됩니다.