초보자의 모험 - 페이지 4

 

안녕하세요 레전드 오브 mql입니다. 직장에서 점심 시간에 의사 코드를 만들어 봤습니다. 여기있어. 무엇이 누락되었는지 알려주고 추가하겠습니다.

N&P 의사 코드
이 전략을 통해 우리는 1개의 코드를 갖고 모든 차트에 첨부할 수 있고 5개의 통화에서 실행되고 규칙이 충족되면 각각에 대해 숏 포지션과 롱 포지션을 모두 입력하기를 원합니다.
---유로USD---
ema7>ema14>sma50이고 PriceNow가 < TopFilterLevel(예: eurusd의 경우 1.3080. 이 값은 매일 조정)이면 다음을 수행합니다.
EURUSD 랏을 구매하십시오(외부 변수가 될 랏, 예: 0.01). 기타: (즉, 조건이 충족되지 않음) 구매하지 마십시오.

ema7<ema14<sma50이고 PriceNow가 > BottomFilterLevel인 경우(예: eurusd의 경우 1.1508):
짧은 EURUSD 랏(agian, 외부 변수). 그렇지 않으면(즉, 충족되지 않은 조건이 부족하지 않음).

BUY 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
SHORT 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
20핍에 도달하지 못한 경우(구매 또는 판매) 포지션이 종료될 때까지 시장에 계속 남아 있습니다.

수동으로. (코드를 더 짧게 유지하기 위해 이것을 OrderSend 함수에 넣는 것이 이상적입니다).

----GBPUSD---
위와 같은 코드입니다.

----USDJPY---
같은 상기와

---USDCHF---
같은 상기와

---AUDUSD---
같은 상기와

**코드 사양
위에 명시된 기준을 충족하는 경우 특정 통화에 대해 매수 및 공매도 거래를 동시에 실행할 수 있습니다.
***이 코드에는 정지 손실이 필요하지 않습니다.

**이 항목에 대한 자금 관리 코드가 없습니다.

그래서 이것은 어떻게 보입니까?

 
niko :

안녕하세요 레전드 오브 mql입니다. 직장에서 점심 시간에 의사 코드를 만들어 봤습니다. 여기있어. 무엇이 누락되었는지 알려주고 추가하겠습니다.

N&P 의사 코드
이 전략을 통해 우리는 1개의 코드를 갖고 모든 차트에 첨부할 수 있고 5개의 통화에서 실행되고 규칙이 충족되면 각각에 대해 숏 포지션과 롱 포지션을 모두 입력하기를 원합니다.
---유로USD---
ema7>ema14>sma50이고 PriceNow가 < TopFilterLevel(예: eurusd의 경우 1.3080. 이 값은 매일 조정)이면 다음을 수행합니다.
EURUSD 랏을 구매하십시오(외부 변수가 될 랏, 예: 0.01). 기타: (즉, 조건이 충족되지 않음) 구매하지 마십시오.

ema7<ema14<sma50이고 PriceNow가 > BottomFilterLevel인 경우(예: eurusd의 경우 1.1508):
짧은 EURUSD 랏(agian, 외부 변수). 그렇지 않으면(즉, 충족되지 않은 조건이 부족하지 않음).

BUY 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
SHORT 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
20핍에 도달하지 못한 경우(구매 또는 판매) 포지션이 종료될 때까지 시장에 계속 남아 있습니다.

수동으로. (코드를 더 짧게 유지하기 위해 이것을 OrderSend 함수에 넣는 것이 이상적입니다).

----GBPUSD---
위와 같은 코드입니다.

----USDJPY---
같은 상기와

---USDCHF---
같은 상기와

---AUDUSD---
같은 상기와

**코드 사양
위에 명시된 기준을 충족하는 경우 특정 통화에 대해 매수 및 공매도 거래를 동시에 실행할 수 있습니다.
***이 코드에는 정지 손실이 필요하지 않습니다.

**이 항목에 대한 자금 관리 코드가 없습니다.

그래서 이것은 어떻게 보입니까?

여러분, 코딩에 대한 기본 자습서는 이 문제를 해결하는 데 정말 도움이 되었습니다(자세한 코딩 부분은 부족하지만). 바쁘다는 것을 보여드리기 위해 아래 코드를 첨부했습니다. 내가 생각하는 아이디어는 있지만 여전히 많은 오류를 반환합니다. 내가 한 이유는 mql이 변수를 전역적으로 선언할 수 없다는 오류와 함께 계속 돌아오기 때문에 모든 것이 Start()에서 하나의 큰 대괄호 아래에 있음을 알 수 있습니다. 오류(많은 다른 오류가 지속되었지만). 나는 메모장 ++을 사용하여 괄호 정렬을 확인했습니다. 그래서 나는 적어도 이것으로 올바른 길을 가고 있습니까?

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

extern double     Lots = 0.01 ;
extern double     TakeProfit = 20 ;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


   //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init ( )
   {
   return ( 0 ) ;
   }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit ( )
   {
   return ( 0 ) ;
   }


   // Order counting code
   // Return:  0 = no orders
   //          >0 = # long orders
   //          <0 = # short orders
       int CalcOpenOrders ( )
         {
         int long = 0 , short = 0 ;
       for ( int i = 0 ; i < OrdersTotal ( ) ; i + + )    
         //i set to 0 to stop bugs from
         //crawling in, i<Orderstotal means if i is behind the number of orders
         //in market then start counting orders and make i that number
         {
         if ( OrderSelect ( i , SELECT_BY_POS , MODE_TRADES ) = = false ) break ;
         //this function selects an order for further processing
         if ( OrderType ( ) = = OP_BUY ) long + + ;
         if ( OrderType ( ) = = OP_SELL ) short + + ;
         }
       if ( long > 0 ) return ( long ) ;
       if ( short > 0 ) return ( - short ) ;
       }

//------------ (fingers crossed this is right). I still don't get it why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1 , ema2 , ema3 , closeup , e1over2 , e2over3 , e1under2 , e2under3 ,
eurusdbuyok , eurusdshortok ;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ( )
   {
   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 ( Bars < 75 )
       {
       Print ( "Bars less than 100" ) ;
       return ( 0 ) ;
       }


   //------------------EURUSD Block-------------------------
   //check order type, if it doesn't equal to buy already then buy


   //here i am setting a condition which will be
   //checked before a trade is opened, it shoudl state 'It's okay to enter
   //into long trade so long as there is either 1 order in place already or
   //none)
  
   // Call function. the returnvalue (output) of the function is stored into ReturnVal
   int ReturnVal = CalcOpenOrders ( ) ;
  
   // Check output of function
   if ( ReturnVal > 0 )    // >0 = long orders. See CalcOpenOrders() 
      eurusdbuyok = 1 ;
       else
       {
      eurusdbuyok = 0 ;
       return ( 0 ) ;
       }

   if ( ReturnVal < 0 )    // <0 = short orders. See CalcOpenOrders()
      eurusdshortok = 1 ;
       else
       {
      eurusdshortok = 0 ;
       return ( 0 ) ;
       }


   //--------------condition ends

   if ( eurusdshortok = = 1 )
       {
       static int ticket ;
       // deleted if(OrdersTotal()==0)
       if ( e1under2 & & e2under3 )      // short function
         {
         ticket = OrderSend ( Symbol ( ) , OP_SELL , Lots , Bid , 0 , 0 , Bid - TakeProfit * Point , "ShortOrder " , 0 , 0 , Red ) ;
         if ( ticket > 0 )
             {
             if ( OrderSelect ( ticket , SELECT_BY_TICKET , MODE_TRADES ) )
             Print ( "SHORT order opened : " , OrderOpenPrice ( ) ) ;
             }
         }
       return ( 0 ) ;
       }



   //  -------------------------------------------------------------------------------------------
   if ( eurusdbuyok = = 1 )
       {
       static int ticket1 ;
       // deleted if(OrdersTotal()==0)
       if ( e1over2 & & e2over3 & & eurusdbuyok = = 1 ) //buy function
         {
         ticket1 = 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 ( ticket1 > 0 )
             {
             if ( OrderSelect ( ticket1 , SELECT_BY_TICKET , MODE_TRADES ) )
             Print ( "BUY order opened : " , OrderOpenPrice ( ) ) ;
             }
         }
       return ( 0 ) ;
       }

   return ( 0 ) ;
   } 
이것은 최신 버전의 코드입니다. 통사적으로는 괜찮은 것 같지만 전략 테스터를 통해 실행하면 거래가 반환되지 않습니다. 논리에 문제가 있습니다. 도움이 필요하다. 나는 이제 코드와 프로그램 측면의 구조에 상당히 익숙해지고 있습니다.
 
niko wrote >>

안녕하세요 레전드 오브 mql입니다. 직장에서 점심 시간에 의사 코드를 만들어 봤습니다. 여기있어. 무엇이 누락되었는지 알려주고 추가하겠습니다.

N&P 의사 코드
이 전략을 통해 우리는 1개의 코드를 갖고 모든 차트에 첨부할 수 있고 5개의 통화에서 실행되고 규칙이 충족되면 각각에 대해 숏 포지션과 롱 포지션을 모두 입력하기를 원합니다.
---유로USD---
ema7>ema14>sma50이고 PriceNow가 < TopFilterLevel(예: eurusd의 경우 1.3080. 이 값은 매일 조정)이면 다음을 수행합니다.
EURUSD 랏을 구매하십시오(외부 변수가 될 랏, 예: 0.01). 기타: (즉, 조건이 충족되지 않음) 구매하지 마십시오.

ema7<ema14<sma50이고 PriceNow가 > BottomFilterLevel인 경우(예: eurusd의 경우 1.1508):
짧은 EURUSD 랏(agian, 외부 변수). 그렇지 않으면(즉, 충족되지 않은 조건이 부족하지 않음).

BUY 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
SHORT 위치가 진입 지점에서 20핍에 도달하면 EURUSD의 TAKEPROFIT.
20핍에 도달하지 못한 경우(구매 또는 판매) 포지션이 마감될 때까지 시장에 계속 남아 있습니다.

수동으로. (코드를 더 짧게 유지하기 위해 이것을 OrderSend 함수에 넣는 것이 이상적입니다).

----GBPUSD---
위와 똑같은 코드입니다.

----USDJPY---
같은 상기와

---USDCHF---
같은 상기와

---AUDUSD---
같은 상기와

**코드 사양
위에 명시된 기준을 충족하는 경우 특정 통화에 대해 매수 및 매도 거래를 동시에 실행할 수 있습니다.
***이 코드에는 정지 손실이 필요하지 않습니다.

**이 항목에 대한 자금 관리 코드가 없습니다.

그래서 이것은 어떻게 보입니까?

안녕 니코

의사 코드는 첫 번째 시도에서 꽤 좋아 보입니다.

그러나 나는 그것이 좀 더 구조화되기를 원하며 그것이 나에게 제기하는 몇 가지 질문이 있습니다.

내가 일반적으로 사용하는 형식으로 쉽고 빠르게 넣을 수 있었습니다. 여기에서 볼 수 있도록 텍스트 파일로 첨부되어 있습니다. 서식을 보려면 이 파일을 저장하고 메모장이나 유사한 편집기에서 열어야 합니다.

이 단계에서는 특정 컴퓨터 언어로 작성하지 않습니다. 우리는 우리가 하려고 하는 것을 명확하고 모호하지 않게 지정하려고 합니다.

의사 코드가 매우 구체적이고 "합법적"이라는 것을 알 수 있습니다. 이것이 우리가 컴퓨터와 대화하는 방법입니다. 우리는 그들이 무엇을 하기를 원하는지 매우 명확하게 설명해야 합니다. 그렇지 않으면 쓰레기를 생성하는 경향이 있습니다.

또한 "블록"을 사용하여 사물을 논리적 그룹으로 정렬하는 것을 알 수 있습니다. 나중에 코드를 적절하게 구성하는 데 도움이 될 수 있습니다. 이 토론의 앞부분에서 누군가가 지적했듯이 우리는 단지 재미로 이것을 하지 않습니다. 우리는 코드를 더 읽기 쉽고, 더 이해하기 쉽고, 더 유지하기 쉽고, 궁극적으로 더 안정적이고 버그가 없도록 만들기 위해 이를 수행합니다. 나중에 버리고 싶은 돈이 많은 양동이가 없는 한 라이브 거래에 사용되는 소프트웨어에서는 후자가 매우 중요합니다. :) . 진지하게, 거래는 버그가 있는 소프트웨어를 다루지 않고도 충분히 어렵습니다.

제가 보낸 내용을 보시고 필요하다고 생각되는 사항을 자유롭게 변경해 주십시오. 내 의사 코드에는 몇 가지 중요한 사항이 빠져 있습니다. 당신은 그들을 찾을 수 있습니까?

의사 코드에서 내가 제기한 두 가지 질문을 처리하고 싶을 수도 있습니다. 다른 여러 질문이 생각나지만 실제 코딩 단계까지 이러한 질문을 남겨두는 것이 좋습니다.

아직 하지 않았다면 이 토론의 앞부분에서 FXtrader2008이 언급한 메모장++ 편집기를 사용해 볼 수 있습니다. 삶을 좀 더 쉽게 만들어주는 도구를 찾을 수 있는 모든 도구를 사용하십시오. 수정된 의사 코드를 텍스트 파일 첨부 파일로 다시 게시하십시오. 이 HTML 편집기에서 의사 또는 기타 구조화된 코드를 작성하려고 하면 약간 지루하고 지저분해집니다.

문안 인사

파일:
 
TSWilson :

안녕 니코

의사 코드는 첫 번째 시도에서 꽤 좋아 보입니다.

그러나 나는 그것이 좀 더 구조화되기를 원하며 그것이 나에게 제기하는 몇 가지 질문이 있습니다.

내가 일반적으로 사용하는 형식으로 쉽고 빠르게 넣을 수 있었습니다. 여기에서 볼 수 있도록 텍스트 파일로 첨부되어 있습니다. 서식을 보려면 이 파일을 저장하고 메모장이나 유사한 편집기에서 열어야 합니다.

이 단계에서는 특정 컴퓨터 언어로 작성하지 않습니다. 우리는 우리가 하려고 하는 것을 명확하고 모호하지 않게 지정하려고 합니다.

의사 코드가 매우 구체적이고 "합법적"이라는 것을 알 수 있습니다. 이것이 우리가 컴퓨터와 대화하는 방법입니다. 우리는 그들이 무엇을 하기를 원하는지 매우 명확하게 설명해야 합니다. 그렇지 않으면 쓰레기를 생성하는 경향이 있습니다.

또한 "블록"을 사용하여 사물을 논리적 그룹으로 정렬하는 것을 알 수 있습니다. 나중에 코드를 적절하게 구성하는 데 도움이 될 수 있습니다. 이 토론의 앞부분에서 누군가가 지적했듯이 우리는 단지 재미로 이것을 하지 않습니다. 우리는 코드를 더 읽기 쉽고, 더 이해하기 쉽고, 더 유지하기 쉽고, 궁극적으로 더 안정적이고 버그가 없도록 만들기 위해 이를 수행합니다. 나중에 버리고 싶은 돈이 많은 양동이가 없는 한 라이브 거래에 사용되는 소프트웨어에서는 후자가 매우 중요합니다. :) . 진지하게, 거래는 버그가 있는 소프트웨어를 다루지 않고도 충분히 어렵습니다.

제가 보낸 내용을 보시고 필요하다고 생각되는 사항을 자유롭게 변경해 주십시오. 내 의사 코드에는 몇 가지 중요한 사항이 빠져 있습니다. 당신은 그들을 찾을 수 있습니까?

의사 코드에서 내가 제기한 두 가지 질문을 처리하고 싶을 수도 있습니다. 다른 여러 질문이 생각나지만 실제 코딩 단계까지 이러한 질문을 남겨두는 것이 좋습니다.

아직 하지 않았다면 이 토론의 앞부분에서 FXtrader2008이 언급한 메모장++ 편집기를 사용해 볼 수 있습니다. 삶을 좀 더 쉽게 만들어주는 도구를 찾을 수 있는 모든 도구를 사용하십시오. 수정된 의사 코드를 텍스트 파일 첨부 파일로 다시 게시하십시오. 이 HTML 편집기에서 의사 또는 기타 구조화된 코드를 작성하려고 하면 약간 지루하고 지저분해집니다.

문안 인사

안녕 TSW. 감사합니다. 나는 당신이 이것에 상당한 시간을 할애하는 것을 볼 수 있습니다. 그래서 나는 정말로 감사합니다. 업데이트 된 의사 코드를 첨부했는데 첨부되지 않은 경우 아래에 있습니다. 나는 당신이 놓친 것을 보려고 노력했지만 잘 알아낼 수 없었고 몇 가지를 추가했지만 그것들은 단지 것들에 대한 설명이었습니다.


여기에서 어디로 갈까요? 우리가 이 '적절한' 코드를 만드는 동안, 나는 여전히 위 코드의 퍼즐을 풀려고 노력하고 있습니다. 오래된 패치 코드이므로 의사 코드를 따르지 않지만 적어도 1 통화에서는 작동해야 하므로 여전히 의아합니다. 핵심은 이 무질서한 방식으로 빌드하는 것입니다. 실제 코딩 요소(예: 대괄호가 스크립트에 미치는 영향, 변수 선언 위치 등)를 알려주는 것입니다. 그 코드가 지금처럼 작동하지 않는 이유에 대한 아이디어가 있습니까?

Program Title  - N&P Pseudo Code

START BLOCK - List of Currency Pairs

     EURUSD
     GBPUSD
     USDJPY
     USDCHF
     AUDUSD

END BLOCK - List Of Currency Pairs



START BLOCK - Configuration Parameters

      Set the value of TopFilterLevel manually on a daily basis for EURUSD
      Set the value of BottomFilterLevel manually on a daily basis EURUSD
      Set the value of TopFilterLevel manually on a daily basis for GBPUSD
      Set the value of BottomFilterLevel manually on a daily basis GBPUSD

      Set the value of TopFilterLevel manually on a daily basis for USDJPY
      Set the value of BottomFilterLevel manually on a daily basis USDJPY
      Set the value of TopFilterLevel manually on a daily basis for USDCHF
      Set the value of BottomFilterLevel manually on a daily basis USDCHF

      Set the value of TopFilterLevel manually on a daily basis for AUDUSD
      Set the value of BottomFilterLevel manually on a daily basis AUDUSD

      Set Lot size manually for All positions at once (same lot size)

END BLOCK - Configuration Parameters



START BLOCK  - Entry Rules

     If   the 7 Period Exponential Moving Average is greater than the 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is greater than the  50 period Simple Moving Average       AND
          Current Price   is less than TopFilterLevel  THEN
                       Signal a  BUY (Long) entry condition

     If   the  7 Period Exponential Moving Average is less than 14 Period Exponential Moving Average  AND
          the 14 Period Exponential Moving Average is less than the 50 period Simple Moving Average       AND
          Current Price   is less than  BottomFilterLevel  THEN
                       Signal a  SELL (Short) entry condition

     ***  Question ***
      What time periods do you want to use for your moving averages? Are the periods  Minutes, Hours, Days, Weeks, Months or  do they need to be variable?
***Answer *** Excellent question. It will be 5 minute periods for all moving averages, they do not need to be variable.

END BLOCK - Entry Rules
      


START BLOCK - Manual Close

      **** Question ***
      You say 
                  "Keep being in the market until the position is closed manually.
                   (ideall we put this into OrderSend function to keep code shorter)."
       
       What exactly do you want the program to do in this block?

***I was unclear on this before, my apologies. There should be no block as this in the code. I will exit positions manually when needed through the trade/terminal window (I assume that’s possible and won’t mess up the EA execution, right). So actually I don’t know if we need to code this flexibility or not? What do you think

END BLOCK - Manual Close  



START BLOCK  - Exit Rules

     If  any Open Position is greater than or equal to 20 pips from the entry level THEN
        Close the Position

END BLOCK  - Exit Rules



START BLOCK - Main  - This block controls the whole flow of the program
         With each Currency Pair in the List of Currency Pairs block do all of the following

                  Process the Exit Rules Block - 
                                    (Note that in practice this would normally just be the automatic execution of a Take Profit  Stop
                                    but we should mention it here in the pseudo code for completness. Of course you may have something else in mind
                                    such as using the program to close an open position—nope not for this code.)
                  Check the Entry Rules block  to see if a BUY or SELL  condition exists for this Currency Pair 

                  Check to see if  there is already  an open  BUY  position for this Currency Pair
                  Check to see if  there is already  an open SELL  position for this Currency Pair

                  If there is no open BUY position  for this currency pair   AND
                      a Buy condition exixts for this currency pair THEN
                              Open a BUY Position  for this currency pair
				Size: Pre-determined Lots

ELSE		If there is already 1 open BUY position for this currency pair		DO NOT OPEN BUY Position for this currency pair.

                   If there is no open SELL position  for this currency pair   AND
                      a SELL condition exixts for this currency pair THEN
                              Open a SELL Position  for this currency pair 
				Size predetermined lots.
  
ELSE		If there is already 1 sell position open for this currency pair		Do not open SELL Positions for this currency pair     
              
END BLOCK - Main 




PS: I will often use just 1 direction on a currency pair (eg: just short, for eurusd for 2 days for instance). How could we build this into the code. My assumption is I could just put ‘//’ infront of the parts of the code I don’t want to use (Eg: infront of buy or sell orders within each currency pair) and then remove them when I need to use that part of code next time. Will this work with a code structured in this way? 

**I can’t really think of anything you left out on purpose, to be honest. Unless it’s to check if there are sufficient funds for the trade, but that’s not necessary yet. Maybe in future versions of the strategy.
 
niko wrote >>

여러분, 코딩에 대한 기본 자습서는 이 문제를 해결하는 데 정말 도움이 되었습니다(자세한 코딩 부분은 부족하지만). 바쁘다는 것을 보여드리기 위해 아래 코드를 첨부했습니다. 내가 생각하는 아이디어는 있지만 여전히 많은 오류를 반환합니다. 내가 한 이유는 mql이 변수를 전역적으로 선언할 수 없다는 오류와 함께 계속 돌아오기 때문에 모든 것이 Start()에서 하나의 큰 대괄호 아래에 있음을 알 수 있습니다. 오류(많은 다른 오류가 지속되었지만). 나는 메모장 ++을 사용하여 괄호 정렬을 확인했습니다. 그래서 나는 적어도 이것으로 올바른 길을 가고 있습니까?

이것은 최신 버전의 코드입니다. 통사적으로는 괜찮은 것 같지만 전략 테스터를 통해 실행하면 거래가 반환되지 않습니다. 논리에 문제가 있습니다. 도움이 필요하다. 나는 이제 코드와 프로그램 측면의 구조에 상당히 익숙해지고 있습니다.

안녕하세요 여러분, 위의 코드 비트(의사 코드가 아니라 코드 코드)에 대한 도움이 있으면 적절한 방법으로 수행하는 방법을 배우는 동안입니다.

오늘 브레인스토밍을 했습니다. 아마도 오류는 주문을 계산하는 하나의 기능이 있고 대신 2개의 기능이 별도로 필요할 수 있습니다. 하나는 구매를 계산하고 다른 하나는 판매를 계산합니다. 아래 코드를 프로그래밍했습니다(이를 설명하기 위해 몇 가지 변경). 아래에서 볼 수 있습니다. 그러나 나는 여전히 완전한 초보자이기 때문에 여전히 모든 것이 엉망이었습니다. 이것에 대한 아이디어가 있습니까?

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

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+


  //-------------------Declaring All Variables and Conditions


//--------------------declaration end


int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}


  // Order counting code
  // Return:  0 = no orders
  //          >0 = # long orders
  //          <0 = # short orders
     int CalcOpenOrders()
        {
        int long=0,short=0;
     for(int i=0;i<OrdersTotal();i++)
        //i set to 0 to stop bugs from
        //crawling in, i<Orderstotal means if i is behind the number of orders
        //in market then start counting orders and make i that number
        {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
        //this function selects an order for further processing
        if(OrderType()==OP_BUY)long++;
        if(OrderType()==OP_SELL)short++;
        }
     if(long>0)return(long);
     if(short>0)return(-short);
     }

//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//--------------DECLARATION OF VARIABLES-------------------------
double ema1,ema2,ema3,closeup, e1over2, e2over3, e1under2, e2under3,
eurusdbuyok, eurusdshortok;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start ()
  {
  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(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }


  //------------------EURUSD Block-------------------------
  //check order type, if it doesn't equal to buy already then buy


  //here i am setting a condition which will be
  //checked before a trade is opened, it shoudl state 'It's okay to enter
  //into long trade so long as there is either 1 order in place already or
  //none)

  // Call function. the returnvalue (output) of the function is
stored into ReturnVal
  int ReturnVal = CalcOpenOrders();

  // Check output of function
  if (ReturnVal >0)  // >0 = long orders. See CalcOpenOrders()
     eurusdbuyok=1;
     else
     {
     eurusdbuyok=0;
     return(0);
     }

  if (ReturnVal<0)   // <0 = short orders. See CalcOpenOrders()
     eurusdshortok=1;
     else
     {
     eurusdshortok=0;
     return(0);
     }


  //--------------condition ends

  if(eurusdshortok==1)
     {
     static int ticket;
     // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"ShortOrder
",0,0,Red);
        if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
           Print("SHORT order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }



  //  -------------------------------------------------------------------------------------------
  if (eurusdbuyok==1)
     {
     static int ticket1;
     // deleted if(OrdersTotal()==0)
     if(e1over2 && e2over3 && eurusdbuyok==1) //buy function
        {
        ticket1=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(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
           Print("BUY order opened : ",OrderOpenPrice());
           }
        }
     return(0);
     }

  return(0);
  }

 
niko wrote >>

안녕하세요 여러분, 위의 코드 비트(의사 코드가 아니라 코드 코드)에 대한 도움이 있으면 적절한 방법으로 수행하는 방법을 배우는 동안입니다.

오늘 브레인스토밍을 했습니다. 아마도 오류는 주문을 계산하는 하나의 기능이 있고 대신 2개의 기능이 별도로 필요할 수 있습니다. 하나는 구매를 계산하고 다른 하나는 판매를 계산합니다. 아래 코드를 프로그래밍했습니다(이를 설명하기 위해 몇 가지 변경). 아래에서 볼 수 있습니다. 그러나 나는 여전히 완전한 초보자이기 때문에 여전히 모든 것이 엉망이었습니다. 이것에 대한 아이디어가 있습니까?

안녕 니코

의사 코드를 참조하여

코드에서:
*** 문제 ***
이동 평균에 어떤 기간을 사용하시겠습니까? 기간은 분, 시간, 일, 주, 월입니까 아니면 가변적이어야 합니까?
***답변 *** 훌륭한 질문입니다. 모든 이동 평균에 대해 5분 기간이 될 것이며 가변적일 필요는 없습니다.

그런 다음 구성 매개변수 영역의 의사 코드에 다음과 같은 명령문을 추가하는 것이 좋습니다.

"지표에 5분 시간 프레임 사용"


당신은 말했다 :
***전에는 이에 대해 명확하지 않았습니다. 죄송합니다. 코드에 이와 같은 블록이 없어야 합니다.

거래/터미널 창을 통해 필요할 때 수동으로 포지션을 종료합니다.

(나는 그것이 가능하고 EA 실행을 엉망으로 만들지 않을 것이라고 가정합니다.)

그래서 실제로 이 유연성을 코딩해야 하는지 여부를 모르겠습니다. 어떻게 생각하나요


그런 다음 의사 코드에서 이 블록을 삭제하는 것이 좋습니다.

터미널을 사용하여 아무 것도 망치지 않고 수동으로 위치를 닫을 수 있도록 EA를 코딩하는 데 문제가 없어야 합니다.

다음 행을 추가했습니다.

ELSE 이 통화 쌍에 대해 이미 1개의 열린 매수 포지션이 있는 경우 이 통화 쌍에 대한 매수 포지션을 열지 마십시오.

ELSE 이 통화 쌍에 대해 이미 1개의 매도 포지션이 열려 있는 경우 이 통화 쌍에 대한 매도 포지션을 열지 마십시오


*** 질문 *** 이전 행이 방금 끝난 후 프로그램이 수행하기를 원하지 않는 것을 구체적으로 명시해야 하는 이유는 무엇입니까?

프로그램이 무엇을 하기를 원하는지 명시했습니다. 제 생각에 의사 코드는 당신의 논리를 신중하게 생각할 수 있는 곳입니다. 그렇지 않으면 당신이 할 가능성이

실제 코딩을 시작할 때 혼란에 빠지십시오.


당신은 말했다 :
추신: 저는 종종 통화 쌍에 대해 한 방향만 사용합니다(예: 2일 동안 유로화의 경우 그냥 짧게). 이것을 코드에 어떻게 구축할 수 있습니까? 내 가정은 내가 사용하고 싶지 않은 코드 부분(예: 각 통화 쌍 내에서 매수 또는 매도 주문 앞에) 앞에 '//'를 넣은 다음 해당 부분을 사용해야 할 때 제거할 수 있다는 것입니다. 다음 시간에 코드. 이런 식으로 구조화된 코드에서 작동합니까?


제안한 대로 코드를 주석 처리하는 것은 그리 우아한 방법이 아닙니다. 또한 코드의 "LONG" 섹션을 주석 처리하면 중복이 많은 코드를 생성하지 않는 한 모든 통화 쌍에 대해 매수 포지션을 여는 기능을 주석 처리하게 됩니다. 이것은 또한 매우 우아한 방법이 아니며 쉽게 오류로 이어집니다.

주어진 기간 동안 EURUSD를 매수하고 GBPUSD를 매도하고 USDCHF를 전혀 거래하지 않기를 원할 수 있습니다. 이것은 매우 쉽게 달성할 수 있지만 의사 코드에서 직접 설명하는 방법을 시도해 보시기 바랍니다.


가능한 한 가지 방법에 대한 몇 가지 힌트가 있습니다.

1. 귀하의 레벨이 어떻게 설정되고 고용되는지 살펴보십시오.

2. 레벨은 십진수로 표시됩니다. go/no go 상황은 부울 또는 플래그로 알려진 다른 유형의 표현을 사용하는 일반적인 관행입니다. 플래그를 사용하여 원하는 작업을 수행할 수 있습니까?


당신은 말했다 :

**솔직히 고의로 빼먹은 건 하나도 생각나지 않습니다. 거래에 충분한 자금이 있는지 확인하는 것이 아니라면 아직까지는 필요하지 않습니다.

아마도 향후 버전의 전략에 있을 것입니다.


아니요, 충분한 자금을 확인하는 것이 아닙니다. 로트 크기를 지정하는 것 외에는 자금 관리를 하지 않는다고 구체적으로 말씀하셨습니다. 그것은 훨씬 더 근본적인 것입니다.

주문하려면 어떤 정보가 필요합니까? 의사 코드에서 이러한 각 항목은 어디에서 어떻게 설명되고 처리됩니까?


당신은 말했다 :

여기에서 어디로 갈까요? 우리가 이 '적절한' 코드를 만드는 동안, 나는 여전히 위 코드의 퍼즐을 풀려고 노력하고 있습니다. 오래된 패치 코드이므로 의사 코드를 따르지 않지만 적어도 1 통화에서는 작동해야 하므로 여전히 의아합니다. 핵심은 이 무질서한 방식으로 빌드하는 것입니다. 실제 코딩 요소(예: 대괄호가 스크립트에 미치는 영향, 변수 선언 위치 등)를 알려주는 것입니다. 그 코드가 지금처럼 작동하지 않는 이유에 대한 아이디어가 있습니까?


나는 당신의 좌절에 감사드립니다. 나는 이전 코드를 매우 빠르게 살펴보았지만 솔직히 말해서 당신이 하려고 하는 것은 논리적으로 별로 의미가 없습니다. 나는 약 15분 안에 이 코드 조각을 다시 작성할 수 있고 그것은 당신이 원하는 대로 할 것입니다. 그러나 그것이 요점이 아닙니다. 코드 작성을 배우고 싶다고 말씀하셨습니다. 직접 해보는 방법을 알려드리려고 합니다.


Nico, 나는 당신이 (새로운) 적절한 코드를 작성하기 시작하는 데 너무 멀리 떨어져 있다고 생각하지 않지만 먼저 의사 코드에 정확하게 못을 박은 "하고 싶은 것"을 최대한 많이 얻는 것이 중요합니다.

곧 보게 될 코딩을 "훨씬 더 쉽게" 만들 것입니다.


좋은 일을 계속

건배

 

팀,


언제나처럼 저와 함께 해주셔서 정말 감사합니다. 귀하의 의견을 반영하도록 의사 코드를 수정하겠습니다. 실제 코드에 대해서는 걱정할 필요가 없습니다. 학습은 무엇보다 강력하기 때문에 제대로 처리해 보겠습니다.

 

팀,


나는 의사 코드를 다시 살펴보고 이 시점에서 내 초보자의 두뇌가 알아낼 수 있는 한 많은 작업을 수행했습니다. 첨부하오니 많은 관심 부탁드립니다!

파일:
 
niko wrote >>

팀,

나는 의사 코드를 다시 살펴보고 이 시점에서 초보자의 두뇌가 알아낼 수 있는 한 많은 작업을 수행했습니다. 첨부하오니 많은 이용 부탁드립니다!

안녕 닉

모든 것이 좋아 보입니다.

귀하의 최신 의사 코드를 살펴보고 몇 가지 질문 등에 답변했습니다.

이제 막 코딩을 시작할 준비가 된 것 같습니다.


매우 대략적인 경험에 따르면 프로그래밍 시간의 1/3은 사양에, 1/3은 코딩에, 1/3은 디버깅 및 테스트에 사용해야 한다고 말합니다.


따라서 우리는 이제 이 작은 프로젝트의 약 1/3을 진행했다고 말할 수 있습니다!

이제 MT4 언어에 대해 이야기해 보겠습니다.


모든 컴퓨터 언어에는 사용자가 지시하려는 작업을 컴퓨터가 이해할 수 있도록 언어를 작성해야 하는 특정 방식(형식)이 있습니다. 문서에서 이에 대한 정보와 기타 언어별 정보를 찾을 수 있습니다. MT4 ia에 대한 문서는 이 포럼에서 온라인으로 사용할 수 있습니다. 아직 하지 않았다면 문서에서 사용할 수 있는 정보의 종류를 살펴보는 데 시간을 할애하는 것이 좋습니다. 그러면 특정 주제나 기능에 대한 정보가 필요할 때 어디서 찾아야 하는지 알게 될 것입니다.


삶을 좀 더 쉽게 만들기 위해 MT4를 포함한 많은 최신 컴퓨터 언어는 기본 프로그램 레이아웃을 설정하는 템플릿을 사용합니다. 이러한 템플릿 프로그램을 종종 "마법사"라고 합니다. MetatEditor의 "새로 만들기" 메뉴 항목 아래에 녹색 십자 표시가 있는 EA 마법사를 찾을 수 있습니다.


이것을 열면 "전문가 고문"에 대한 템플릿을 찾을 수 있습니다. 이것을 선택하면 EA 이름, 작성자 세부 정보 등 및 매개변수를 입력하라는 메시지가 표시됩니다. 매개변수는 나중에 추가하거나 변경할 수 있지만 이 단계에서는 구성 블록에서 매개변수를 입력할 수 있습니다.

각 매개변수에 이름, 유형 및 초기 값을 제공해야 합니다.


매개변수 이름은 항상 매개변수가 무엇인지 설명해야 합니다.


예를 들어 EURUSD_TopFilterLevel은 의미 있는 이름 ex1 IS NOT입니다. 의미 있는 데이터 이름을 사용하면 프로그램을 나중에 디버그하거나 수정하기가 훨씬 더 쉽게 이해할 수 있습니다. MT4에서 데이터 이름은 대소문자를 구분합니다. LOTSize는 LotSize와 다릅니다. 주의하고 데이터 이름과 일치해야 합니다.


또한 각 매개변수에 대한 데이터 유형(유형)을 지정해야 합니다. MT4는 Integer Number(int), Decimal Number(double), Text(string) 및 True/False 또는 Flag(bool) 4가지 데이터 유형만 사용합니다.


다시 한 번 우리는 데이터 유형에 주의해야 하고 무의식적으로 혼동하지 않도록 해야 합니다. 그렇지 않으면 미묘한 버그가 발생할 수 있습니다.


마법사를 사용하여 템플릿을 만든 후에는 프로그램을 "구조화"하기 시작하는 것이 좋습니다. MT4의 기본 구조 단위는 FUNCTION입니다.


여기에 쓰여진 것처럼 실제로는 아무 것도 하지 않는 가장 단순한 기본 기능은 다음과 같습니다.



무효 MyBasicFunction()

{

}


메타트레이더 마법사에 의해 생성된 템플릿에는 이미 3개의 빈 함수가 있습니다.



정수 초기화()

{

반환(0)

}



초기화 초기화()

{

반환(0)

}



정수 시작()

{

반환(0)

}


init 함수는 EA를 차트로 드래그하고 Expert Advisor 버튼 ON을 클릭하면 EA가 시작될 때마다 호출됩니다.

deinit 함수는 EA를 차트 밖으로 드래그하거나 Expert Advisor 버튼 OFF를 클릭할 때 EA가 멈출 때마다 호출됩니다.


시작 기능은 첨부된 차트에서 수신한 EVERY NEW TICK에서 호출됩니다. 이는 시장이 얼마나 바쁜지에 따라 1분에 여러 번 또는 그 이상 호출될 수 있음을 의미합니다. 여기에서 대부분의 작업을 수행할 것입니다.


당분간은 메인 블록의 모든 의사 코드를 시작 함수에 넣은 다음 각 줄에 //를 사용하여 의사 코드를 주석 처리하는 것이 좋습니다.


그런 다음 항목 규칙 블록에 대한 고유한 새 기능을 만들고 같은 방식으로 의사 코드를 주석 처리합니다.


init 및 deint 기능을 비워두고 당분간 그대로 두십시오.


이 코드를 오류 없이 컴파일할 수 있어야 하지만 물론 이 단계에서는 아무 작업도 수행하지 않습니다.


좋은 일을 계속하십시오!


문안 인사

(추신 필요한 경우 스카이프에서 이야기할 수 있지만 당분간 포럼을 어떻게 진행하는지 살펴보겠습니다.)

파일:
 

팀,

항상 그렇듯이 귀하의 도움과 시간은 매우 소중합니다! 감사의 표시로 코딩 과정을 마치면 아주 좋은 샴페인 한 병을 보내 주셨으면 합니다.

네, 저는 mql 책을 꽤 많이 읽었습니다. 어려운 점은 이론을 실행에 옮기는 것이었습니다. 나는 또한 이 웹사이트에 게시된 약 10개 정도의 EA를 인쇄하여 코드화 및 조합을 확인하고 이해하려고 했습니다. 그리고 저는 MT4의 시뮬레이터 트레이더에서 많은 시간을 보냅니다(즉, 이미 존재하는 EA의 백테스팅 및 학습).

코딩 프로세스를 시작하고 블록을 매우 명확하고 분리하여 진행 상황을 볼 수 있도록 합니다. 그리고 포럼을 통해 보내주십시오.

1 질문: 당신은 중개 회사가 공격적인 피핑을 막기 위해 투자한다고 말했습니다. 1. 공격적인 피핑을 무엇이라고 정의합니까? 2. 그들은 어떤 것들을 제자리에 두는가?

나는 수동으로 1분 간격으로 eurusd를 스캘핑(spreadbetting 방법 사용)했는데, 이것은 중개업체가 클릭하고 실행(입장 및 퇴장)에 대한 지연을 두기 시작할 때까지 정말 잘 진행되었습니다. 따라서 이제 이 중개를 통해 이 작업을 수행하는 것은 아무 의미가 없습니다. 불법이더라도 지연은 여전히 발생하고 하루 종일 엉망이 됩니다(예: 일반적으로 1시간, 2개의 지연으로 두피를 관리하고 귀중한 시간을 잃는 경우). 나는 법원의 적극적인 위협 이후 지연된 거래에 대해 모든 돈을 돌려받았습니다.

2 질문: 다른 브로커를 사용합니까? 어떤 브로커를 추천하시겠습니까? (여기서 이름을 언급할 수 있는 경우)

감사해요,

새긴 금

사유: