그리드 메이커 1.1 - 페이지 4

 
죄송합니다, 저는 주어진 그리드 위치에 대해 하나의 주문만 가지고 있으며 지금 몇 주에 걸쳐 거의 모든 변형을 테스트했습니다.

MT4 친구들이 화나지 않도록 가끔 열려 있는 모든 주문을 삭제합니다.

백 테스팅에서 이 문제가 발생하지만 이것은 스크립트 문제가 아니라 MT4 백테스팅 문제입니다.

계속되면 알려주거나 문제를 보여주는 보고서를 보내주십시오...

감사합니다.

거대한
 
나는 그것을 찾았다. 그리고 나는 그것에 대해 즐겁지 않습니다.

어드바이저가 제 코멘트 "GridEURUSD"로 그리드를 생성하고 있습니다. 이 댓글은 주문이 기다리는 동안 댓글 필드에 남아 있습니다. 주문이 활성화되면 댓글이 "활성화/자동"으로 변경됩니다. 결국 이 동작으로 인해 설명된 문제가 발생했음이 분명합니다.

나는 Alpari와 거래하고 있습니다. 데모 계정 에서 MT4를 지원합니다.

이 동작을 우회할 수 있는지 확인하겠습니다. 즉, 주문의 마법을 그리드에 대한 식별자로 사용하여 결과를 알려줍니다.

이것을 테스트하는 동안 그리드의 정리 스크립트도 수정했습니다. 미결 주문을 마감하는 기능도 추가했습니다. 불행히도 미결 주문을 마감하려고 하면 주문 잠김을 의미하는 오류 129가 발생합니다. 그러나 주어진 그리드에 대한 모든 보류 주문을 삭제합니다.

//+----------------------------------------------- -------------------+
//| RemoveGrid.mq4 |
//| 저작권 © 2005년, HDB |
//| http://www.dubois1.net/hdb |
//+----------------------------------------------- -------------------+
#property copyright "Copyright © 2005, hdb"
#속성 링크 "http://www.dubois1.net/hdb"

외부 문자열 GridName = "그리드";
extern bool closeOpen = 거짓;

//+----------------------------------------------- -------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
  {
 
 
 #property show_inputs // 매개변수 표시 - Slawa님 감사합니다... 

//---- 
  정수 합계 = OrdersTotal();
  정수 나 ;
  
      for(i=total-1; i>=0;i--)
 
      {
        주문 선택(i, SELECT_BY_POS);
        정수 유형 = 주문 유형();

        if ( OrderSymbol()==Symbol() && OrderComment() == GridName )
        {
          부울 결과 = 거짓;
    
          스위치(유형)
          {
            케이스 OP_BUY : if ( closeOpen ) {
                                    결과 = OrderClose( OrderTicket(), OrderLots(), 묻기, 0, 파란색 );
                                }
                                부서지다;
            케이스 OP_SELL : if ( closeOpen ) {
                                    결과 = OrderClose( OrderTicket(), OrderLots(), 입찰가, 0, 파란색 );
                                }
                                부서지다;
            //대기 중인 주문 닫기
            경우 OP_BUYLIMIT : 결과 = OrderDelete( OrderTicket() );
                                부서지다; 
            경우 OP_BUYSTOP : 결과 = OrderDelete( OrderTicket() ); 
                                부서지다; 
            케이스 OP_SELLLIMIT : 결과 = OrderDelete( OrderTicket() ); 
                                부서지다; 
            경우 OP_SELLSTOP : 결과 = OrderDelete( OrderTicket() ); 
                                부서지다; 
          }
    
          if(결과 == 거짓)
          {
            Print("Order " , OrderTicket() , " 닫지 못했습니다. 오류:" , GetLastError() );
     // 슬립(3000);
          }  
        }
      }
 
//----
   리턴(0);
  }
//+----------------------------------------------- -------------------+




코리

 
알았어 코리.. 감사합니다.

그것이 작동하는지 알려주고 마술을 사용할 것입니다. 브로커가 그런 이상한 일을한다는 것을 몰랐기 때문에 !!

감사합니다.

거대한
 
이제 됐어.

주석 대신 OrderMagicNumber를 사용하도록 gridMaker를 변경했습니다. 나는 또한 코멘트 작성에 대해 약간의 수정을 했습니다.

결과는 다음과 같습니다.

//+----------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| 저작권 © 2005년, HDB |
//| http://www.dubois1.net/hdb |
//+----------------------------------------------- -------------------+
#property copyright "Copyright © 2005, hdb"
#속성 링크 "http://www.dubois1.net/hdb"
//#속성 버전 "1.4베타"

// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
extern int uniqueGridMagic = 11111; // 거래의 매직 넘버. 식별하려면 고유해야 합니다.
                                         // 하나의 그리드 거래    
extern 이중 랏 = 0.1; // 
외부 이중 그리드 크기 = 6; // 주문 사이의 핍 - 그리드 또는 메쉬 크기
외부 이중 GridSteps = 12; // 총 주문 수
외부 이중 TakeProfit = 6 ; // 이익을 얻을 틱 수. 일반적으로 = 그리드 크기이지만 재정의할 수 있습니다.
외부 이중 손절매 = 0; // 정지 손실을 추가하려는 경우. 일반 그리드는 정지 손실을 사용하지 않습니다.
외부 이중 UpdateInterval = 1; // x분마다 주문 업데이트
extern bool wantLongs = true; // 우리는 긴 위치를 원합니까
extern bool wantShorts = true; // 우리는 숏 포지션을 원합니까?
extern bool wantBreakout = true; // 가격보다 높은 롱, 가격보다 낮은 숏을 원합니까?
extern bool wantCounter = true; // 가격보다 낮은 롱, 가격보다 높은 숏을 원합니까?
extern bool limitEMA34 = 거짓; // ema 위의 long, ema 아래의 short만 원합니까?

// 코리에 의해 수정됨. 내부 변수만
이중 마지막 업데이트 = 0; // 마지막 업데이트 시간을 기록하는 데 사용되는 카운터
이중 GridMaxOpen = 0; // 오픈 포지션의 최대 수
문자열 그리드 이름 = "그리드"; // 그리드를 식별합니다. 여러 개의 공존 그리드 허용
//+----------------------------------------------- -------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- -------------------+
정수 초기화()
  {
//---- 
 #property show_inputs // 매개변수 표시 - Slawa님 감사합니다...    
 if ( TakeProfit <= 0 ) // 
   { TakeProfit = 그리드 크기; }
//----
   그리드 이름 = StringConcatenate( "그리드", Symbol());
   리턴(0);
  }
//+----------------------------------------------- --------------------------+
//| atRate 영역에 열린 위치 또는 주문이 있는지 테스트합니다 |
//| checkLongs가 true이면 long을 확인하고 그렇지 않으면 확인합니다 |
//| 반바지 |
//+----------------------------------------------- --------------------------+

bool IsPosition(더블 atRate, 더블 inRange, bool checkLongs)
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
        // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
        if ( OrderSymbol()==Symbol() && OrderMagicNumber() == uniqueGridMagic ) // mygrid와 symbol...
         { 정수 유형 = 주문 유형();
            if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // 정확한 가격을 찾지 않고 가격 근접성(gridsize보다 작음)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    반환(참); 
                 }
              }
         }
      } 

   반환(거짓);
  }
//+----------------------------------------------- -------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
  {
//---- 
   int i, j, k, 티켓, entermode, totalorders;
   부울 도트;
   더블 포인트, 시작율, 거래율;
 
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // 처음 호출될 때마다 UpdateInterval 분마다 업데이트합니다.
   {
   마지막 업데이트 = CurTime();
   Print("업데이트 중");
   포인트 = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( 묻기 + point*GridSize/2 ) / point / GridSize; // GridSize로 나눌 수 있는 틱 수로 반올림
   k = 시작 속도 ;
   k = k * 그리드 크기 ;
   시작 속도 = k * 포인트 - GridSize*GridSteps/2*point ; // 가장 낮은 진입점 계산
   
   이중 EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   
   for( i=0;i<GridSteps;i++)
   {
     거래율 = 시작율 + i*point*GridSize;
     
     if ( wantLongs && (!limitEMA34 || 거래율 > EMA34))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
            이중 myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래 포인트*StopLoss ; }
               
             if ( traderate > Ask ) 
              { 입력 모드 = OP_BUYSTOP; } 
              또 다른 
              { 입력 모드 = OP_BUYLIMIT ; } 
              
              if ( ((거래 > 묻기) && (wantBreakout)) || ((거래하기 <= 묻기) && (wantCounter)) ) 

              { 
                  // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                  ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
   
             }
          }
       }

     if ( wantShorts && (!limitEMA34 || 거래율 < EMA34))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
             myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래율+포인트*StopLoss ; }
             if ( 거래율 > 입찰가 ) 
              { 입력 모드 = OP_SELLLIMIT; } 
              또 다른 
              { 입력 모드 = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
               {    
                  // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                  ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); }
          }
       }

    }
   }
   리턴(0);
  }
//+----------------------------------------------- -------------------+



안녕, 코리

 
고마워 코리...

이미 몇 가지 변경 사항을 직접 수행했기 때문에 변경 사항을 최신 버전에 통합했습니다.

저는 약간의 변형을 가했습니다. 현재 그리드를 활성 상태로 유지하기 위해 매직 OR 그리드 이름을 테스트했습니다...

내가 올바르게했는지 확인할 수 있습니까?



//+----------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| 저작권 © 2005년, HDB |
//| http://www.dubois1.net/hdb |
//+----------------------------------------------- -------------------+
#property copyright "Copyright © 2005, hdb"
#속성 링크 "http://www.dubois1.net/hdb"
//#속성 버전 "1.6베타"

// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
extern int uniqueGridMagic = 11111; // 거래의 매직 넘버. 식별하려면 고유해야 합니다.
                                         // 하나의 그리드 거래    
extern 이중 로트 = 0.1; // 
외부 이중 그리드 크기 = 6; // 주문 사이의 핍 - 그리드 또는 메쉬 크기
외부 이중 GridSteps = 12; // 총 주문 수
외부 이중 TakeProfit = 12 ; // 이익을 얻을 틱 수. 일반적으로 = 그리드 크기이지만 재정의할 수 있습니다.
외부 이중 정지 손실 = 0; // 정지 손실을 추가하려는 경우. 일반 그리드는 정지 손실을 사용하지 않습니다.
외부 이중 UpdateInterval = 1; // x분마다 주문 업데이트
extern bool wantLongs = true; // 우리는 긴 위치를 원합니까
extern bool wantShorts = 거짓; // 우리는 숏 포지션을 원합니까?
extern bool wantBreakout = true; // 가격보다 높은 롱, 가격보다 낮은 숏을 원합니까?
extern bool wantCounter = true; // 가격보다 낮은 롱, 가격보다 높은 숏을 원합니까?
extern bool limitEMA34 = true; // ema 위의 long, ema 아래의 short만 원합니까?
외부 이중 GridMaxOpen = 0; // 오픈 포지션의 최대 수 : 아직 구현되지 않음..
extern bool UseMACD = true; // true이면 longs에만 macd >0을 사용하고 shorts에만 macd >0을 사용합니다.
                                       // 교차 시 보류 중인 모든 주문을 취소합니다. 이것은 무엇이든 무시할 것입니다
                                       // wantLongs 및 wantShort 설정 - 적어도 지금은.
extern bool CloseOpenPositions = false;// UseMACD인 경우 오픈 포지션도 손실로 마감합니까?

// 코리에 의해 수정됨. 내부 변수만
문자열 그리드 이름 = "그리드"; // 그리드를 식별합니다. 여러 개의 공존 그리드 허용
이중 마지막 업데이트 = 0; // 마지막 업데이트 시간을 기록하는 데 사용되는 카운터

//+----------------------------------------------- -------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- -------------------+
정수 초기화()
  {
//---- 
 #property show_inputs // 매개변수 표시 - Slawa님 감사합니다...    
 if ( TakeProfit <= 0 ) // 
   { TakeProfit = 그리드 크기; }
//----
// 내 corri를 추가하고 hdb에 의해 제거되었습니다!! lol .. 열린 그리드와 호환되도록 ...
// 그리드 이름 = StringConcatenate( "그리드", Symbol() );
   리턴(0);
  }
//+----------------------------------------------- --------------------------+
//| atRate 영역에 열린 위치 또는 주문이 있는지 테스트합니다 |
//| checkLongs가 true이면 long을 확인하고 그렇지 않으면 확인합니다 |
//| 반바지 |
//+----------------------------------------------- --------------------------+

bool IsPosition(더블 atRate, 더블 inRange, bool checkLongs)
  {
  
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
         { 정수 유형 = 주문 유형();
            if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // 정확한 가격을 찾지 않고 가격 근접성(gridsize보다 작음)
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    반환(참); 
                 }
              }
         }
      } 
   반환(거짓);
  }

//+----------------------------------------------- --------------------------+
//| 모든 보류 주문 취소 |
//+----------------------------------------------- --------------------------+

CloseAllPendingOrders() 무효화
  {
     int totalorders = OrdersTotal();
     for(int j=totalorders-1;j>=0;j--) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
// Cori에 따라 수정됩니다. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
         {  
          정수 유형 = 주문 유형();
          부울 결과 = 거짓;
          스위치(유형)
          {
             경우 OP_BUY : 결과 = true ;
             케이스 OP_SELL : 결과 = true ;
            //대기 중인 주문 닫기
            경우 OP_BUYLIMIT : 결과 = OrderDelete( OrderTicket() ); 
            경우 OP_BUYSTOP : 결과 = OrderDelete( OrderTicket() ); 
            케이스 OP_SELLLIMIT : 결과 = OrderDelete( OrderTicket() ); 
            경우 OP_SELLSTOP : 결과 = OrderDelete( OrderTicket() ); 
          }
         }
      } 
   반품;
  }


//+----------------------------------------------- --------------------------+
//| 보류 중인 모든 주문을 취소하고 열린 포지션을 닫습니다 |
//+----------------------------------------------- --------------------------+

무효 CloseOpenOrders()
{
  정수 합계 = OrdersTotal();
  for(int i=total-1;i>=0;i--)
 {
    주문 선택(i, SELECT_BY_POS);
    정수 유형 = 주문 유형();
    부울 결과 = 거짓;
// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
    if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
     {
// Print("닫기 2 ",유형);
        스위치(유형)
         {
           //오픈된 롱 포지션 닫기
           경우 OP_BUY : 결과 = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, 빨간색 );
                               부서지다;
           //오픈 숏포지션 청산
           케이스 OP_SELL : 결과 = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                               부서지다;
           //대기 중인 주문 닫기
           케이스 OP_BUYLIMIT:
           케이스 OP_BUYSTOP:
           케이스 OP_SELLLIMIT:
           경우 OP_SELLSTOP : 결과 = OrderDelete( OrderTicket() );
         }
      }
    if(결과 == 거짓)
    {
 // Alert("Order " , OrderTicket() , " 닫지 못했습니다. Error:" , GetLastError() );
 // 슬립(3000);
    }  
  }
  반품;
}

//+----------------------------------------------- -------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
  {
//---- 
   int i, j, k, 티켓, entermode, totalorders;
   부울 도트;
   더블 포인트, 시작율, 거래율;
//----
  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // 처음 호출될 때마다 UpdateInterval 분마다 업데이트합니다.
   {
   마지막 업데이트 = CurTime();
   포인트 = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( 묻기 + point*GridSize/2 ) / point / GridSize; // GridSize로 나눌 수 있는 틱 수로 반올림
   k = 시작 속도 ;
   k = k * 그리드 크기 ;
   시작 속도 = k * 포인트 - GridSize*GridSteps/2*point ; // 가장 낮은 진입점 계산
   이중 EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0);
   if ( UseMACD ) {
      더블 Macd0=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
      더블 Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
      더블 Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
       if( Macd0>0 && Macd1>0 && Macd2<0) // 교차
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       if( Macd0<0 && Macd1<0 && Macd2>0) // 크로스 다운
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       원하는 길이 = 거짓;
       원하는 반바지 = 거짓;
       if( Macd0>0 && Macd1>0 && Macd2>0) // 0보다 훨씬 높습니다.
        {
         원하는 길이 = true;
        }
       if( Macd0<0 && Macd1<0 && Macd2<0) // 0보다 훨씬 아래임
        {
         원하는 반바지 = 사실;
        }
   }
   for( i=0;i<GridSteps;i++)
   {
     거래율 = 시작율 + i*point*GridSize;
     if ( wantLongs && (!limitEMA34 || 거래율 > EMA34))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
            이중 myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래 포인트*StopLoss ; }
             if ( traderate > Ask ) 
              { 엔터 모드 = OP_BUYSTOP; } 
              또 다른 
              { 입력 모드 = OP_BUYLIMIT ; } 
              if ( ((거래 > 문의 ) && (wantBreakout)) || ((거래 <= 문의 ) && (wantCounter)) ) 
              { 
                  // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                 ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
             }
          }
       }
     if ( wantShorts && (!limitEMA34 || 거래율 < EMA34))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
             myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래율+포인트*StopLoss ; }
             if ( 거래율 > 입찰가 ) 
              { 입력 모드 = OP_SELLLIMIT; } 
              또 다른 
              { 입력 모드 = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { 
                   // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                   ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); 
                }
          }
       }
    }
   }
   반환(0);
  }
//+----------------------------------------------- -------------------+
 
안녕하세요 hdb님

괜찮아 보인다. 하지만 매개변수 로 필요하지 않았기 때문에 GridName을 extern으로 정의해야 합니다.

인사, 코리
 
주의 GridMaker의 모든 사용자 - IsPosition 기능 에 버그가 있습니다. 그 결과 모든 그리드 슬롯이 채워지지 않습니다.

다음과 같이 라인을 변경할 수 있습니다.

if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // 정확한 가격을 찾지 않고 가격 근접성(gridsize보다 작음)

에게

if (MathAbs( OrderOpenPrice() - atRate ) < (inRange*0.9)) // 정확한 가격을 찾지 않고 가격 근접성(gridsize보다 작음) - 부동 소수점 오류로 인해 0.9 추가


이렇게 하면 문제가 해결됩니다.

불편을 끼쳐 드려 죄송합니다...

거대한
 
안녕하세요 휴즈입니다.

이 문제가 이미 거기에 있습니까?

이전 MQL2에서 비슷한 것을 찾았습니다.

이 문제를 해결하는 정말 확실한 방법은 다음과 같이 하는 것입니다.

int intOOP = MathRound( OrdeOpenPrice() / 포인트 );

모든 이중 변수에 대해. 그러면 오류 없이 비교할 수 있는 모든 직선 int 변수가 있습니다.

명확하고 이해할 수 있도록 작성하는 것이 조금 더 많지만 결함은 적습니다.

관련하여,

코리
 
U 맞습니다 Cori, 그것은 훨씬 더 우아합니다! 나만 게으르다!

문안 인사,
거대한
 
다음은 GridMaker EA에 대한 업데이트입니다. 이 버전에는 다음이 있습니다.

1) UseMACD, wantLongs, wantShorts에 대한 논리를 변경했습니다. 이전에는 useMACD가 설정된 경우 wnatLongs 및 wantShorts 플래그에 관계없이 EA가 long 및 short를 사용했습니다. 이제 useMACD는 이 플래그를 재정의하지 않으므로 useMACD만 사용하거나 short만 사용할 수 있습니다.

2) limitEMA34가 설정된 경우 EMA의 잘못된 쪽에서 미결 주문이 없는지 확인하기 위해 추가 수표를 추가했습니다. 예전에는 주문이 EMA 위 또는 아래에 잘 배치되었지만 몇 시간 후에 EMA가 이동했기 때문에 EMA의 양쪽에 주문이 있었습니다.

3) OrderType()의 switch 문에 버그가 있는 것 같습니다. 그것이 무엇인지는 모르겠지만 정말 웃기게 행동합니다. 나는 단순히 switch 문을 제거하고 "if"로 대체했습니다... 마음에 들지 않지만 작동합니다!

4) EMA 기간 변수를 만들었습니다... 백테스팅 에 좋습니다.

누군가가 원하는 경우 몇 가지 동반자 스크립트도 있습니다.

1) 한 쌍의 채워지지 않은 미결 주문을 제거하기 위해
2) 모든 쌍에 대한 모든 미결 주문을 한 번에 제거
3) 모든 포지션을 청산하고 미결 주문을 제거합니다.
4) 열린 위치 및 기록에서 그리드 동작에 대한 간단한 통계를 얻습니다.

V1.08의 코드는 다음과 같습니다.


//+----------------------------------------------- -------------------+
//| MakeGrid.mq4 |
//| 저작권 © 2005년, HDB |
//| http://www.dubois1.net/hdb |
//+----------------------------------------------- -------------------+
#property copyright "Copyright © 2005, hdb"
#속성 링크 "http://www.dubois1.net/hdb"
//#속성 버전 "1.8"
// 면책 조항 ***** 중요 참고 사항 ***** 사용하기 전에 읽으십시오 ***** 
// 이 전문 고문은 실제 포지션을 열고 닫을 수 있으므로 실제 거래를 하고 실제 돈을 잃을 수 있습니다.
// 이것은 '거래 시스템'이 아니라 고정된 규칙에 따라 거래를 하는 단순한 로봇입니다.
// 저자는 이 시스템의 수익성에 대해 아무런 생각이 없으며 사용을 제안하지 않습니다.
// 데모 계정에서 테스트 목적 이외의 이 EA.
// 이 시스템의 사용은 무료이지만 재판매할 수 없습니다.
// 모든 목적에 대한 적합성.
// 이 프로그램을 사용함으로써 귀하는 이 프로그램이 하는 일을 이해하고 다음 사항에 동의한다는 것을 암묵적으로 인정합니다. 
// 작성자는 모든 손실에 대해 책임을 지지 않습니다.
// 사용하기 전에 브로커에게 그의 시스템이 프리퀘스트 거래에 맞게 조정되었는지도 확인하십시오.
// 이 전문가와 연결됩니다.
// 1.8 변경
// wantLongs 및 wantShorts를 지역 변수로 만듭니다. 이전에는 UseMACD를 true로 설정하면 
// long과 short를 수행하고 단순히 wantLongs 및 wantShorts 플래그를 무시했습니다. 
// 이제 이 플래그는 무시되지 않습니다.
// limitEMA34일 때 EMA 위 또는 아래에 '불법' 미결 주문이 있는지 확인하는 루프를 추가했습니다.
// 플래그가 사용됩니다. 이들은 시간이 지남에 따라 누적되며 제거되지 않으며 EMA 이동으로 인한 것입니다.
// 스위치 명령이 작동하지 않는 것처럼 보이므로 제거 - if 문으로 대체
// EMA 기간을 변수로 만들었습니다.
//
//
// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
extern int uniqueGridMagic = 11111; // 거래의 매직 넘버. 식별하려면 고유해야 합니다.
                                         // 하나의 그리드 거래    
extern 이중 랏 = 0.1; // 
외부 이중 그리드 크기 = 6; // 주문 사이의 핍 - 그리드 또는 메쉬 크기
외부 이중 GridSteps = 12; // 총 주문 수
외부 이중 TakeProfit = 12 ; // 이익을 얻을 틱 수. 일반적으로 = 그리드 크기이지만 재정의할 수 있습니다.
외부 이중 손절매 = 0; // 정지 손실을 추가하려는 경우. 일반 그리드는 정지 손실을 사용하지 않습니다.
외부 이중 UpdateInterval = 1; // x분마다 주문 업데이트
extern bool wantLongs = true; // 우리는 긴 위치를 원합니까
extern bool wantShorts = true; // 우리는 숏 포지션을 원합니까?
extern bool wantBreakout = true; // 가격보다 높은 롱, 가격보다 낮은 숏을 원합니까?
extern bool wantCounter = true; // 가격보다 낮은 롱, 가격보다 높은 숏을 원합니까?
extern bool limitEMA = true; // ema 위의 long, ema 아래의 short만 원합니까?
extern int EMAperiod = 34; // EMA..의 길이는 이전에 34로 고정되었습니다.
외부 이중 GridMaxOpen = 0; // 오픈 포지션의 최대 수 : 아직 구현되지 않음..
extern bool UseMACD = true; // true이면 longs에만 macd >0을 사용하고 shorts에만 macd >0을 사용합니다.
                                       // 교차 시 보류 중인 모든 주문을 취소합니다. 이것은 무엇이든 무시할 것입니다
                                       // wantLongs 및 wantShort 설정 - 적어도 지금은.
extern bool CloseOpenPositions = false;// UseMACD인 경우 오픈 포지션도 손실로 마감합니까?
extern bool doHouseKeeping = true; // 그냥 테스트

// 코리에 의해 수정됨. 내부 변수만
문자열 그리드 이름 = "그리드"; // 그리드를 식별합니다. 여러 개의 공존 그리드 허용
이중 마지막 업데이트 = 0; // 마지막 업데이트 시간을 기록하는 데 사용되는 카운터

//+----------------------------------------------- -------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- -------------------+
정수 초기화()
  {
//---- 
 #property show_inputs // 매개변수 표시 - Slawa님 감사합니다...    
//----
// 내 corri를 추가하고 hdb에 의해 제거되었습니다!! lol .. 열린 그리드와 호환되도록 ...
// 그리드 이름 = StringConcatenate( "그리드", Symbol() );
   리턴(0);
  }
//+----------------------------------------------- --------------------------+
//| atRate 영역에 열린 위치 또는 주문이 있는지 테스트합니다 |
//| checkLongs가 true이면 long을 확인하고 그렇지 않으면 확인합니다 |
//| 반바지 |
//+----------------------------------------------- --------------------------+

bool IsPosition(더블 atRate, 더블 inRange, bool checkLongs)
  {
     int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
         { 정수 유형 = 주문 유형();
            if (MathAbs( OrderOpenPrice() - atRate ) < (inRange*0.9)) // 정확한 가격을 찾지 않고 가격 근접성(gridsize보다 작음) - 부동 소수점 오류로 인해 0.9 추가
              { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) )
                 { 
                    반환(참); 
                 }
              }
         }
      } 
   반환(거짓);
  }

//+----------------------------------------------- --------------------------+
//| 모든 보류 주문 취소 |
//+----------------------------------------------- --------------------------+

CloseAllPendingOrders() 무효화
  {
     int totalorders = OrdersTotal();
     for(int j=totalorders-1;j>=0;j--) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
// Cori에 따라 수정됩니다. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
         {  
          정수 유형 = 주문 유형();
          if ( 유형 > 1 ) bool 결과 = OrderDelete( OrderTicket() );
         }
      } 
   반품;
  }
//+----------------------------------------------- --------------------------+
//| 보류 중인 모든 주문을 취소하고 열린 포지션을 닫습니다 |
//+----------------------------------------------- --------------------------+

무효 CloseOpenOrders()
{
  정수 합계 = OrdersTotal();
  for(int i=total-1;i>=0;i--)
 {
    주문 선택(i, SELECT_BY_POS);
    정수 유형 = 주문 유형();
    부울 결과 = 거짓;
// 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별 // 호환성을 위해 추가된 hdb 또는 gridname
    if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
     {
           //오픈된 롱 포지션 닫기
           if ( type == OP_BUY ) result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
           //오픈 숏포지션 청산
           if ( type == OP_SELL ) result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
           //대기 중인 주문 닫기
           if ( 유형 > 1 ) 결과 = OrderDelete( OrderTicket() );
      }
  }
  반품;
}

//+----------------------------------------------- --------------------------+
//| , EMA의 잘못된 쪽에 속하는 모든 미결 주문 취소 |
//+----------------------------------------------- --------------------------+

EMA의 CloseOrders 무효(EMAValue 두 배)
  {
     int totalorders = OrdersTotal();
     for(int j=totalorders-1;j>=0;j--) // 모든 주문과 위치를 스캔합니다...
      {
        주문 선택(j, SELECT_BY_POS);
        if ( OrderSymbol()==Symbol() && ( (OrderMagicNumber() == uniqueGridMagic) || (OrderComment() == GridName)) ) // mygrid와 symbol...
         {  
          정수 유형 = 주문 유형();
          부울 결과 = 거짓;
//if (유형 > 1) Print(유형," ",theEMAValue," ",OrderOpenPrice());
          if ( 유형 == OP_BUYLIMIT && OrderOpenPrice() <= theEMAValue ) 결과 = OrderDelete( OrderTicket() ); 
          if ( 유형 == OP_BUYSTOP && OrderOpenPrice() <= theEMAValue ) 결과 = OrderDelete( OrderTicket() ); 
          if ( 유형 == OP_SELLLIMIT && OrderOpenPrice() >= theEMAValue ) 결과 = OrderDelete( OrderTicket() ); 
          if ( 유형 == OP_SELLSTOP && OrderOpenPrice() >= theEMAValue ) 결과 = OrderDelete( OrderTicket() ); 
         }
      } 
   반품;
  }
//+----------------------------------------------- -------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
  {
//---- 
   int i, j, k, 티켓, entermode, totalorders;
   부울 도트;
   더블 포인트, 시작율, 거래율;
//---- 설정 매개변수 

 if ( 이익실현 <= 0 ) // 
   { TakeProfit = 그리드 크기; }

 부울 myWantLongs = wantLongs;
 부울 myWantShorts = 원하는 쇼츠;

//----

  if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // 처음 호출될 때마다 UpdateInterval 분마다 업데이트합니다.
   {
   마지막 업데이트 = CurTime();
   포인트 = MarketInfo(Symbol(),MODE_POINT);
   startrate = ( 묻기 + point*GridSize/2 ) / point / GridSize; // GridSize로 나눌 수 있는 틱 수로 반올림
   k = 시작 속도 ;
   k = k * 그리드 크기 ;
   시작 속도 = k * 포인트 - GridSize*GridSteps/2*point ; // 가장 낮은 진입점 계산
   이중 myEMA=iMA(NULL,0,EMAperiod,0,MODE_EMA,PRICE_CLOSE,0);
   
   if (limitEMA) 
     {
    if (doHouseKeeping) CloseOrdersfromEMA(myEMA);
     }
   경우 ( MACD 사용 )  
     {
      더블 Macd0=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
      더블 Macd1=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
      더블 Macd2=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
       if( Macd0>0 && Macd1>0 && Macd2<0) // 교차
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       if( Macd0<0 && Macd1<0 && Macd2>0) // 크로스 다운
        {
         CloseAllPendingOrders();
         if ( CloseOpenPositions == true ) { CloseOpenOrders(); }
        }
       myWantLongs = 거짓;
       myWantShorts = 거짓;
       if( Macd0>0 && Macd1>0 && Macd2>0 && wantLongs ) // 0보다 훨씬 높습니다.
        {
         myWantLongs = 사실;
        }
       if( Macd0<0 && Macd1<0 && Macd2<0 && wantShorts ) // 0보다 훨씬 아래임
        {
         myWantShorts = 사실;
        }
   }
   for( i=0;i<GridSteps;i++)
   {
     거래율 = 시작율 + i*point*GridSize;
     if ( myWantLongs && (!limitEMA || 거래율 > myEMA))
       {
         if ( IsPosition(traderate,point*GridSize,true) == false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
            이중 myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래 포인트*StopLoss ; }
             if ( traderate > Ask ) 
              { 엔터 모드 = OP_BUYSTOP; } 
              또 다른 
              { 입력 모드 = OP_BUYLIMIT ; } 
              if ( ((거래 > 문의 ) && (wantBreakout)) || ((거래 <= 문의 ) && (wantCounter)) ) 
              { 
                  // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                 ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,uniqueGridMagic,0,Green); 
             }
          }
       }
     if ( myWantShorts && (!limitEMA || 거래율 < myEMA))
       {
         if (IsPosition(traderate,point*GridSize,false)== false ) // 내 가격에 가까운 미결제 주문이 없는지 테스트합니다. 그렇다면 하나를 놓으십시오.
          {
             myStopLoss = 0;
             if ( 손절매 > 0 )
               { myStopLoss = 거래율+포인트*StopLoss ; }
             if ( 거래율 > 입찰가 ) 
              { 입력 모드 = OP_SELLLIMIT; } 
              또 다른 
              { 입력 모드 = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { 
                   // 코리에 의해 수정됨. OrderMagicNumber를 사용하여 그리드 거래 식별
                   ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,uniqueGridMagic,0,Red); 
                }
          }
       }
    }
   }
   리턴(0);
  }
//+----------------------------------------------- -------------------+