2개의 EMA 교차 EA를 만들었습니다. 조언이 필요합니다.

 

안녕하세요!

저는 mql 4를 처음 사용하고 간단한 2 EMA 교차 고문을 만들었습니다. 데모 계정 에서 테스트했지만 실제 계정에서 사용하는 것이 조금 두렵습니다.

1h 규모의 작은 로트로 테스트하면 시간이 너무 많이 걸리고 분 규모로 테스트하는 것은 비용이 많이 듭니다. 내 브로커의 최소 로트가 약 7 USD이기 때문입니다.

그래서, 당신이 그것을 살펴보고 내가 할 수 있었던 명백한 실수를 지적해 주시면 감사하겠습니다.

이 고문은 매우 변동성이 큰 Bitcoin/USD 시장에서 거래해야 하므로(가격은 하루에 +-30% 올라갈 수 있음) 손절매와 이익실현은 핍이 아니라 매수 또는 매도의 백분율로 표시됩니다.

변수와 물건:

 #property copyright "me"
#property link        "killnosock.net"
extern int SlowEma = 21 ;
extern int FastEma = 10 ;
extern int MaxRisk = 100 ; // % of Depo to be traded per order
extern int   TakeProfit= 100 ;
extern int   StopLoss= 100 ;
extern int Slippage = 10 ;

int LastBars = 0 ;

int init(){ return ( 0 );}
int deinit() { return ( 0 );}

이 기능은 주문당 사용할 수 있는 보증금의 %(int Risk)에 따라 로트 크기를 결정하는 것입니다.

 double GetLot( int Risk)
{ double Free    = AccountFreeMargin ();
 double One_Lot = MarketInfo ( Symbol (), MODE_MARGINREQUIRED );
 double Min_Lot = MarketInfo ( Symbol (), MODE_MINLOT );
 double Max_Lot = MarketInfo ( Symbol (), MODE_MAXLOT );
 double Step    = MarketInfo ( Symbol (), MODE_LOTSTEP );
 double Lot     = MathFloor (Free*Risk/ 100 /One_Lot/Step)*Step;
 if (Lot<Min_Lot) Lot=Min_Lot;
 if (Lot>Max_Lot) Lot=Max_Lot;
 if (Lot*One_Lot>Free) {
 Alert ( " free= " , AccountFreeMargin (), " for one lot= " , MarketInfo ( Symbol (), MODE_MARGINREQUIRED ), " lot= " , Lot);
 return ( 0.0 );}
return (Lot);}

새 주문을 여는 기능입니다. Cmd는 매수 또는 매도입니다.

 int NewOrder( int Cmd, double Lot)
{ double TP= 0 ; //takeprofit
 double SL= 0 ; //stoploss
 double PR= 0 ; //price
 color clr = CLR_NONE;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if (Cmd== OP_BUY )
   {PR= Ask ;
     if (TakeProfit> 0 ) TP= Ask + Ask *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Ask - Ask *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Green;}
 if (Cmd== OP_SELL )
   {PR= Bid ;
     if (TakeProfit> 0 ) TP= Bid - Bid *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Bid + Bid *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Red;}
 int tic= OrderSend ( Symbol (),Cmd,Lot,PR,Slippage,SL,TP, "" , 0 , 0 ,clr);
 if (tic< 0 ) Print ( "Open order error: " ,GetLastError());
return (tic);}

여기에서 1개의 주문을 마감하거나 모든 주문을 마감합니다.

 //CloseOrder
void CloseOrder()
{ double PR= 0 ;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if ( OrderType ()== OP_BUY )  PR= Bid ;
 if ( OrderType ()== OP_SELL ) PR= Ask ;
 if (! OrderClose ( OrderTicket (), OrderLots (),PR,Slippage,CLR_NONE))
   Print ( "Order close error: " ,GetLastError());
return ;}
 //Close all Orders
void CloseAllOrders()
{
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
      CloseOrder();
     }
return ;}

이 함수는 빠르고 느린 EMA 차이를 계산하는 데 사용됩니다(빠른 EMA - 느린 EMA):

 double EmaDiff( int shift)
   {
       double difference;
      difference = iMA ( Symbol (), 0 ,FastEma, 0 , MODE_EMA , PRICE_CLOSE ,shift)
                 - iMA ( Symbol (), 0 ,SlowEma, 0 , MODE_EMA , PRICE_CLOSE ,shift);
       return (difference);
   }

그리고 여기에 본체가 있습니다.

 int start()
  {
double Lot;
    // check if new bar opened
     if (LastBars == Bars ) return ( 0 );
     else LastBars = Bars ;
      {         
         if ((EmaDiff( 1 ) > 0 ) && (EmaDiff( 2 ) < 0 ))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder( OP_BUY ,Lot);
            }
            
         if ((EmaDiff( 2 ) > 0 ) && (EmaDiff( 1 ) < 0 ))
            {
               CloseAllOrders();
               Lot = GetLot(MaxRisk);
               NewOrder( OP_SELL ,Lot);
            }                    
      }
   return ( 0 );
  }

나는 후행 정지를 추가하고 느리고 빠른 EMA가 서로 매우 가까워지고 모든 막대와 교차할 때 잘게 잘리지 않도록 EmaDiff를 0이 아니라 일부 작은 walue와 비교하는 것을 고려할 것입니다.

 
 //CloseOrder
void CloseOrder()
{ double PR= 0 ;
 while (! IsTradeAllowed ()) Sleep ( 10 );
 RefreshRates ();
 if ( OrderType ()== OP_BUY )  PR= Bid ;
 if ( OrderType ()== OP_SELL ) PR= Ask ;
 if (! OrderClose ( OrderTicket (), OrderLots (),PR,Slippage,CLR_NONE))
   Print ( "Order close error: " ,GetLastError());
return ;}



//Close all Orders
void CloseAllOrders()
{
   for ( int i= OrdersTotal ()- 1 ;i>= 0 ;i--)
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
      CloseOrder();
     }
return ;}

기호를 확인 하지 않음 매직넘버를 확인하지 않음....

그렇다면 다른 EA와 함께 라이브를 사용하면 어떻게 될까요 ???

 
deVries :

기호를 확인하지 않음 매직넘버를 확인하지 않음....

그렇다면 다른 EA와 함께 라이브를 사용하면 어떻게 될까요 ???


하나의 계정에서 두 개의 EA를 실행하는 것을 의미합니까?
 
prupru :

하나의 계정에서 두 개의 EA를 실행하는 것을 의미합니까?
2개의 EA 또는 1개의 EA 및 수동으로 배치된 거래. . . 또는 수동으로 배치된 거래.
 
prupru :

안녕하세요!

저는 mql 4를 처음 사용하고 간단한 2 EMA 교차 고문을 만들었습니다. 데모 계정에서 테스트했지만 실제 계정에서 사용하는 것이 조금 두렵습니다.

1h 규모의 작은 로트로 테스트하면 시간이 너무 많이 걸리고 분 규모로 테스트하는 것은 비용이 많이 듭니다. 내 브로커의 최소 로트가 약 7 USD이기 때문입니다.

그래서, 당신이 그것을 살펴보고 내가 할 수 있었던 명백한 실수를 지적해 주시면 감사하겠습니다.

그렇게 하라는 메시지가 표시되지 않고 거래 함수 반환 값을 확인하는 사람을 보는 것이 좋습니다. . . 그러나 문제의 원인을 진단할 수 있도록 오류가 발생하는 경우 더 많은 정보가 필요합니다. 살아 있는 상황에서 시간을 되돌려 당시 스프레드가 무엇인지 또는 동결 수준 이 무엇인지 확인할 수 없습니다. . .

 if (tic < 0 ) Print ( "Open order error: " , GetLastError());

. . . 이것은 좋지만 더 많은 것이 필요합니다. 오류가 발생한 원인을 파악할 수 있도록 인쇄해야 할 변수는 무엇입니까? 필요한 것이 무엇인지 결정했으면 모든 것을 Print() 호출에 추가하여 Ask, Bid 등과 같은 이중 변수에 대해 올바른 소수 자릿수(DoubeToStr(value,digits))를 사용했는지 확인하십시오.

 
RaptorUK :

그렇게 하라는 메시지가 표시되지 않고 거래 함수 반환 값을 확인하는 사람을 보는 것이 좋습니다. . .

죄송하지만 그 부분을 이해하지 못했습니다. 내가 얻은 유일한 것은 Print() 호출 에 가능한 한 많은 변수를 추가해야 한다는 것입니다. 포인트 가져왔습니다. 감사합니다.

deVries, 조언도 감사합니다. 이제 무슨 말인지 이해합니다.

수정해야 할 다른 것이 있습니까?

 

당연히 있다

     // check if new bar opened
     if (LastBars == Bars ) return ( 0 );
     else LastBars = Bars ;

이미 최대 바가 있다고 가정합니다(한도 있음).....

 
deVries :

당연히 있다

이미 최대 막대가 있다고 가정합니다(제한이 있음).....


알겠습니다. 새 초가 열리는 순간을 더 잘 포착하려면 어떻게 해야 하나요?
 
prupru :

알겠습니다. 새 초가 열리는 순간을 더 잘 포착하려면 어떻게 해야 하나요?


최신 막대 시간 확인 Time[0]

NewBar를 검색하면 몇 가지 예를 찾을 수 있습니다.

 
deVries :


최신 막대 시간 확인 Time[0]

NewBar를 검색하면 몇 가지 예를 찾을 수 있습니다.


고마워, 나는 이것을 발견했다 https://www.mql5.com/en/code/10370

 
 if (Cmd== OP_BUY )
   {PR= Ask ;
     if (TakeProfit> 0 ) TP= Ask + Ask *TakeProfit/ 100 ;
     if (StopLoss> 0 ) SL= Ask - Ask *StopLoss/ 100 ;
     if (SL< 0 ) SL = 0 ;
     if (TP< 0 ) TP = 0 ;
    clr = Green;}

나는 이것이 옳지 않다고 생각한다

어떻게 100핍 테이크프로핏과 150핍 손절매를 얻나요 ???

업데이트 참조 " 손절매와 이익 실현은 핍이 아니라 입찰 또는 매도의 백분율로 표시됩니다."

여전히 그런 식으로 유효한 가격을 얻습니까? 기호에 5자리가 있으면 결과는 종종 2자리가 더 많습니다.