초보자의 모험

 

안녕하세요 여러분, 제 코드를 도와주셔서 감사합니다. 런던은 오전 2시 11분입니다. 저는 잠시 동안 이 mql 수수께끼를 해독하려고 노력했습니다. 그건 그렇고 CodesGuru는 튜토리얼에 대해 감사를 표합니다. 튜토리얼은 제공되는 표준 항목보다 명확합니다. 좋은 노력입니다!


저는 전략 코딩에 대한 초보자 탐구 중이며 항상 이에 대한 전문가의 도움이 필요합니다.


아래는 내가 함께 만든 코드이지만 어떤 이유로 짧은 거래만 실행합니다.


이유를 몰라서 막혔습니다. 또한 다음을 추가해야 합니다. 1. 이미 반대 방향으로 거래가 열려 있는지 여부에 관계없이 코드는 Long 및 Short 거래를 모두 실행해야 합니다(예: 열려 있는 긴 거래가 있는 경우 코드는 여전히 입력해야 합니다. 조건이 충족되면 숏 포지션). 나는 ' OrdersTotal ()==0; 기능은 있지만 어떻게 해야 할지 모르겠습니다.


도와주세요. 코드가 첨부되어 있습니다. (나는 그것을 첨부하려고했지만 어떤 이유로 그것은되지 않습니다. 무슨 일이 일어나고 있는지?)


이 코드를 실현하는 데 가장 도움이 되는 사람에게 좋은 샴페인 한 병을 약속합니다 :-)


추신: mt4 시뮬레이터/전략 테스터에서 이것을 테스트합니다.


여러분의 도움을 기다리십시오!

새긴 금

 
//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double     Lots = 0.01 ;
extern double     TakeProfit = 20 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   if ( Bars < 75 )
       {
       Print ( "Bars less than 100" ) ;
       return ( 0 ) ; 
       }
   //Declaration
   
   double ema1 , ema2 , ema3 , closeup , e1over2 , e2over3 , e1under2 , e2under3 ;
  
  ema1 = iMA ( NULL , 0 , 7 , 0 , MODE_EMA , PRICE_CLOSE , 0 ) ;
  ema2 = iMA ( NULL , 0 , 14 , 0 , MODE_EMA , PRICE_CLOSE , 0 ) ;
  ema3 = iMA ( NULL , 0 , 50 , 0 , MODE_SMA , PRICE_CLOSE , 0 ) ;
 e1under2 = ema1 < ema2 ;
 e2under3 = ema2 < ema3 ;
 e1over2 = ema1 > ema2 ;
 e2over3 = ema2 > ema3 ;

 
 

   if ( OrdersTotal ( ) = = 0 )    // one order at the time
       {
       // Short  Entry
       static int ticket ;
       if ( e1under2 & & e2under3 )      // short function
         {                                                                     
         ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;    
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
             }
             if ( OrdersTotal ( ) = = 0 )    // one order at the time
             if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables
         
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
         ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
             }
             else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
             return ( 0 ) ;      
         }
 
            
            

            
            
            
             return ( 0 ) ;      
         }
         
         
  
   return ( 0 ) ;
   }
   }
그것이 바로 코드입니다!
 

우와! "초보자"를 위한 코딩의 꽤 좋은 일. 내가 할 수 있는 것보다 훨씬 더 간결하게 코드를 작성할 수 있습니다.


BUY 섹션에 대해 두 개의 동일한 conditional-if 라인이 있는 반면 SELL 섹션에는 하나만 있습니다.


BUY 함수 에 대한 두 번째 동일한 condition-if 문은 아마도 무해하지만 꼭 필요한가요?


 if(OrdersTotal()==0) // 한 번에 하나의 주문
if(e1over2 && e2over3) // 이전 버전은 모든 변수에 대해 ==1이었기 때문에 지저분할 수 있습니다. <<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<첫 번째는 여기

{
if(e1over2 && e2over3) //함수 구매 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<여기서 두 번째
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //12345는 무엇을 위한 것인가? 나는 ASk-30*스톱로스 포인트를 추가했습니다.
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());
}
else Print("구매 주문 열기 오류: ",GetLastError());
리턴(0);
}


또한 동일한 Conditional-if에 Sell 및 Buy 기능이 모두 포함된 것으로 보입니다.



if(OrdersTotal()==0) // 한 번에 하나의 주문
{
// 짧은 항목
정적 int 티켓;
if(e1under2 && e2under3) // 짧은 함수
{ // 이에 대한 대괄호는 SELL 및 BUY 기능 아래에 있습니다.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<아래 참조
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"단기 주문",0,0,Red);
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("짧은 주문이 열렸습니다: ",OrderOpenPrice());
}


if(OrdersTotal()==0) // 한 번에 하나의 주문
if(e1over2 && e2over3) //이것은 지저분할 수 있습니다. 왜냐하면 이전 버전은 모든 변수에 대해 ==1이었기 때문입니다.

{
if(e1over2 && e2over3) //구매 함수
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green); //12345는 무엇을 위한 것인가? 나는 ASk-30*스톱로스 포인트를 추가했습니다.
if(티켓>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("구매 주문이 열렸습니다: ",OrderOpenPrice());
}
else Print("구매 주문 열기 오류: ",GetLastError());
리턴(0);
}







리턴(0);
} // 이것은 위에 표시된 대괄호와 일치합니다.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<위 참조


리턴(0);
}
}





BUY 주문은 명시된 조건부-if가 정렬된 방식으로 SELL 기준을 따릅니다.









 
niko :
그것이 바로 코드입니다!

긴 주문을 하지 않는 이유는 닫는 중괄호로 짧은 주문을 수행하는 코드 블록을 닫지 않았기 때문입니다. 이것은 본질적으로 내가 상상하는 ( e1under2 & & e2under3 ) AND ( e1over2 & & e2over3 ) 가 일어나지 않을 것이라고 생각하는 경우에만 긴 주문을 실행한다는 것을 의미합니다.


다른 방향에서 이미 열려 있는 주문이 있더라도 주문을 열고 싶다고 말합니다. 여기에서 주문 수 를 각 방향으로 최대 1개로 제한하고 싶다고 가정합니다. OrdersTotal()이 0과 같은지 확인하는 것을 포함하면 각 방향에 하나씩이 아니라 총 1개의 주문 합계로 효과적으로 제한됩니다. 당신이 해야 할 일은 루프와 카운터(이 사이트에 많은 예제가 있음)를 사용하여 기존 주문의 수와 유형을 확인한 다음 그 결과를 사용하여 주문해야 하는지 여부를 결정하는 것입니다.


다른 게시물에서 MQL 작성을 배우고 싶다고 언급했기 때문에 이 글을 쓰지는 않겠습니다. 이 예제는 학습 과정에 필수적인 올바른 종류의 간단한 코드 및 논리입니다.


이 작업을 직접 수행하고 어떻게 진행되는지 알려주십시오.

 

얘들아 너희들은 레전드야!!!

귀하의 의견에 감사드립니다. 나는 구매를 위한 반복되는 조건이 있다는 것을 알아차리지 못했다, 나는 그것을 잘라냈고, 브래킷이 닫히지 않는다는 점에서 의미가 있다. 코드를 직접 배우고 싶기 때문에 코드화된 답변을 제공하지 않는 것이 좋습니다. 루프/카운터를 온라인으로 살펴보겠습니다.

오, 코드가 너무 멋지고 간결한 이유는 내 친구가 (프로그래머인) 함께 작성하는 것을 도왔기 때문입니다.

나는 내 일을 계속하고 내가 막히면 당신에게 알릴 것입니다!

라이브 마켓을 독립적으로 거래하십니까? 아니면 메타쿼트를 위해 일하십니까?

 

귀하의 코드를 자세히 살펴보지는 않았지만 첫 번째 팁은 다음과 같습니다.


코드를 더 명확하게 구조화하십시오. 재미를 위해 이 작업을 하는 것이 아니라 더 나은 읽기와 이해를 위해 하는 것입니다! 코드의 "의미"나 의미에 영향을 미치지 않습니다 ...


코드가 어떻게 보여야 하는지 살펴보겠습니다(필수 부분만).

 if ( OrdersTotal ( ) = = 0 )    // one order at the time 
   {
   // Short  Entry
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function
     {                                                                     
      ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;   
       if ( ticket > 0 )
         {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
         }
       if ( OrdersTotal ( ) = = 0 )    // one order at the time
       if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
            ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
         if ( ticket > 0 )
           {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
           }
         else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
         return ( 0 ) ;     
         }
       return ( 0 ) ;     
     }
   return ( 0 ) ;
   }
 

지금 볼 수 있듯이: "짧은" 조건만 테스트합니다.

   // Short  Entry 
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function

그리고 이 내부에서 보안을 위해 "긴" 조건을 두 번 테스트합니다. ) - 이것은 작동하지 않습니다.

       if ( e1over2 & & e2over3 )      //this may be messy cos old version had ==1 for all variables 
         {
         if ( e1over2 & & e2over3 ) //buy function                                                                    
 

더 나은: (그러나 완벽함과는 거리가 멀다)

 if ( OrdersTotal ( ) = = 0 )    // one order at the time 
   {
   // Short  Entry
   static int ticket ;
   if ( e1under2 & & e2under3 )      // short function
     {                                                                     
      ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "Short Order " , 0 , 0 , Red ) ;   
       if ( ticket > 0 )
         {
         if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
         } }
   if ( e1over2 & & e2over3 ) //buy function {
      ticket = OrderSend ( Symbol ( ) , OP_BUY , Lots , Ask , 0 , 0 , Ask + TakeProfit * Point , "" , 0 , 0 , Green ) ;    //What's 12345 for? I ADDED ASk-30*Point for stop loss
       if ( ticket > 0 )
        {
          if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) ) Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
         }
       else Print ( "Error opening BUY order : " , GetLastError ( ) ) ;
     }
  return ( 0 ) ;
  }

이제 장단기 거래에서 작동해야 합니다.

여기에서 MQL4에 대한 이 책을 읽기를 적극 권장합니다. 특히 일반 프로그램 생성 섹션은 매우 훌륭하게 작성되었으며 전략을 쉽게 구현할 수 있습니다. 나도 그렇게 시작했는데...

거기에서 파일을 다운로드하고 주석에 문제가 있는 경우(키릴 자모이므로) "단어"를 열고 인터넷 페이지(주석이 영어이므로)에서 각 파일의 소스를 복사하여 단어에 붙여넣고 마지막으로 단어에서 복사하여 붙여넣으십시오. 메타에디터. 이제부터 영어로 프로그램을 공부할 수 있습니다.


도움이 될 수 있기를...


(참고로 저는 MQL4도 처음이지만 프로그래머로 일하기 때문에 구문과 구조는 문제가 되지 않습니다...)


인사말 TurRiCAN

 
앗 제가 답변해야 할 시간에 다른 분들이 더 빨랐어요...
 
TuRRiCAN wrote >>
앗 제가 답변해야 할 시간에 다른 분들이 더 빨랐어요...

Hey Tourrican 이것은 매우 유용합니다 감사합니다! 키릴 자모 문제 없습니다. 저는 실제로 시베리아 출신의 러시아인입니다.

예, 나는 mql 책을 공부했지만 여전히 실용적인 학습의 밖입니다. 그것을 연구하고 직접 프로그램을 작성하는 것은 완전히 다른 것입니다(왜냐하면 그들은 각 부분의 실제 생활 예제로 명확하게 설명하지 않기 때문입니다. 책, 그 물건이 왜 그리고 어떻게 사용되는지 알고 있습니다.

그러나 거기에 이르면 이 일을 하고 싶은 내 안의 불타는 욕망이 그 어떤 장애물보다 크다.

 
niko :

라이브 마켓을 독립적으로 거래하십니까? 아니면 메타쿼트를 위해 일하십니까?

귀하의 질문에 답하자면, 저는 보통 헬리콥터 조종사로 일하고 있습니다. 그러나 경제 상황을 감안할 때 내가 일하는 회사는 현재 비행기를 타고 싶지 않습니다. 그래서 그 사이에 절친한 친구가 소유한 회사를 위해 EA를 개발했습니다. 우리는 꽤 잘 알려진 펀드를 대신하여 실시간 거래를 하고 있습니다.

나는 당신이 코딩을 배우려고 노력하고 있다는 것을 기쁘게 생각하며 내가 할 수 있을 때마다 도움을 줄 것입니다. 포럼에 가입하고 자급자족하는 법을 배우고 싶은 사람을 찾는 것은 상쾌합니다.