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

 
안녕 또

내가 집에 갈 때 당신을 추가할 yuor 답변 주셔서 감사합니다
 
이 코드는 그리드를 완벽하게 유지하는 데 문제가 있는 경우가 있습니다(적어도 브레이크아웃 그리드가 아닌 풀백으로 실행할 때). 나는 구멍이 형성되고 업데이트되지 않는 것을 보았고 10개 주문 모두에서 때때로 그리드가 완전히 형성되지 않는 것을 보았습니다. 또한, 업데이트 시간 설정이 너무 짧은 것을 좋아하지 않는 것 같고 왜 그런지 모르겠습니다. 그리드를 업데이트하기에는 15분이 너무 길기 때문에(15초 이상!) 이것이 주요 문제인 것 같습니다. 이러한 경험이 있는지 알려주시면 감사하겠습니다. 그러나 이 일을 진행하는 데 있어 훌륭한 일입니다. 잘 하셨어요.
 
소마,

맞습니다. 누군가 나에게 지적하고 수정 된 것 같은 버그가있었습니다. 여기 새 버전이 있습니다. 나는 또한 간격을 1분으로 변경했지만 15분에서 30분이 더 좋다고 생각합니다. 시장이 정말 빠르게 움직일 때 약간의 카운터 거래를 피할 것입니다.

문안 인사,

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

외부 문자열 GridName = "그리드"; // 그리드를 식별합니다. 여러 개의 공존 그리드 허용
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만 원합니까?
외부 이중 LastUpdate = 0; // 마지막 업데이트 시간을 기록하는 데 사용되는 카운터
외부 이중 GridMaxOpen = 0; // 오픈 포지션의 최대 수
//+----------------------------------------------- -------------------+
//| 전문가 초기화 기능 |
//+----------------------------------------------- -------------------+
정수 초기화()
  {
//---- 
 #property show_inputs // 매개변수 표시 - Slawa님 감사합니다...    
 if ( TakeProfit <= 0 ) // 
   { TakeProfit = 그리드 크기; }
//----
   리턴(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);
        if ( OrderSymbol()==Symbol() && 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 ) ) )
                 { 
                    반환(참); 
                 }
              }
         }
      } 

   반환(거짓);
  }
//+----------------------------------------------- -------------------+
//| 스크립트 프로그램 시작 기능 |
//+----------------------------------------------- -------------------+
정수 시작()
  {
//---- 
   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)) ) 

              { 
                  ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,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)) ) 
                { 티켓=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); }
          }
       }

    }
   }
   반환(0);
  }
//+----------------------------------------------- -------------------+
 
고마워, hdb. 그러나 너무 빨리 업데이트하는 것이 나쁜 이유를 알 수 없기 때문에 그리드에 대해 어떻게 생각하는지 정확히 이해하지 못할 수 있습니다. 항목이 누락되면 그리드가 최대한의 잠재력을 발휘하지 못하게 됩니다. 수동으로 실행할 때 변경 사항이 있을 때 두 번째로 주문을 업데이트합니다. 나는 브레이크아웃 그리드가 아닌 풀백 그리드를 실행하므로 아마도 차이점이 있을 것입니다.
 
소마,

예, 아마도 당신이 맞을 것입니다 .. 그래서 가장 좋은 것은 자주 업데이트하지만 몇 개의 그리드 슬롯 만 업데이트하는 것입니까? 그래도 테스트가 필요합니다. 나는 강한 의견이 없습니다.

감사합니다,
 
글쎄, 나는 그리드의 업데이트를 게시하기에 유리한 순간을 기다리고 있었다 - 그 성능이 최근에 정말 형편없었기 때문이다.
마지막 업데이트 다음 주에 나는 휴가 중이었고 그리드가 중지되었습니다. 지난 주에는 그리드가 대부분의 시간 동안 실행되었습니다.
나는 어베일 마진이 0일 때 몇 번이고 대부분의 전공에서 '롱만'을 설정했습니다.
오늘은 슈퍼 컴백의 날이었습니다.

잔고 : 93 (10일 전부터 +10)
사용 마진 : +15k
어베일 관리: +28k
비현실적인. p&l : -49k(10일 전부터 -11)
잔액 : 44k

순가는 10일 전보다 1k 나빠지고 시작 잔액보다 5k 낮습니다.

이 모든 것에서 정말 어려운 부분은 드로다운을 제한하는 것입니다. 나는 정말로 이것을 할 방법을 찾아야만 한다!
 
드로다운을 피하는 유일한 방법은 재량적 방법을 사용하는 것이라고 생각합니다.
즉, 언제 주문 추가를 중단하고 언제 숏 포지션 추가를 중단했는지 알 수 있습니다.

큰 로트 크기를 사용하여 나쁘게 시작하고 많은 위치를 청산해야 했던 후 100K 잔액으로 시작했습니다.

잔고: 97 594.19 약 2주 전 잔고 83k
자유 마진: 6 016.88
유동 손익: -38 960.45는 -56k만큼 나쁩니다.
마진: 52 616.86

지난 며칠간 정말 느린 마진 수준이 93%로 낮았습니다.

하지만 지금은 모든 메이저들이 한동안 미친듯이 돌아서고 있는 것 같았습니다.
마진 수준이 약 130%까지 회복되었습니다.
 
동의합니다, darkstonexa, 당신이 옳을 수도 있다고 생각합니다 - 하지만 저는 om ema 및 macd 를 기반으로 하는 몇 가지 자동화된 변형을 테스트하고 있습니다 ...그렇게 낙관적이지는 않습니다.

친구도 손절매를 실행하는 하나가 있습니다. 그리고 그것은 떠돌아다니기 위해 고군분투하고 있습니다! 하지만 실제로는 드로다운 문제를 해결합니다!

그 동안 저는 포지션을 정리했습니다. 마이너스 캐리가 강하고 손실 가능성이 높은 모든 포지션(몇 100핍)이 마감되었습니다.

그래서 내 그리드는 이제 머리에 또 다른 타격을 줄 준비가 되었습니다(430%의 마진율)!
 
글쎄, 우리가 보낸 2일 동안 얼마나 좋은지... 어제 꽤 치명적인 거래의 주 후에 그린에서 내 그리드 +5k를 보았습니다.

운이 좋게도 데모 계정 을 사용해 볼 수 있습니다!

이제 '합리적인' 위치로 돌아왔으므로 다음을 수행하도록 모든 통화 쌍을 설정했습니다.
1) 양의 캐리 이자의 방향으로만 거래합니다(이자율이 0에 가까우면 양방향으로 수행)
2) 34 ema 이상만 긴 옷, 34 ema 이하의 반바지만
3) 양방향 통화의 경우 5분 차트에서 macd를 사용하여 장/단기 결정

우리는 이것이 무엇을 주는지 보게 될 것입니다!

추신. 백테스트가 잘 되었으면 좋겠습니다!
 
안녕하세요 hdb님

나는 EURUSD에 대한 고문을 데려가 양쪽 모두를 돌파구로 거래했습니다.

이제 다음 문제에서 이미 실행 중인지 묻고 싶습니다.

잠시 후 동일한 그리드 위치 중 일부에 대해 둘 이상의 주문이 있습니다. 가끔 2개가 있는 경우도 있지만 5개 이상도 본 적이 있습니다.

내가 코드를 이해하는 한 그리드 위치에서 한 번에 하나만 열려야 합니다.

MQL2에서 double 값을 비교할 때 비슷한 문제를 발견했기 때문에 비교하기 전에 모든 double을 int로 변환하는 것을 엉망으로 만들었습니다.

비슷한 일을 겪었습니까?

관련하여,

코리