English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
트레이더의 황금률

트레이더의 황금률

MetaTrader 4트레이딩 시스템 | 12 10월 2021, 17:29
350 0
Genkov
Genkov

소개

트레이더의 주요 임무는 시장에 진입할 적절한 시기를 찾는 것 뿐만이 아닙니다. 빠져나갈 적절한 순간을 찾는 것도 필요하다. 거래의 황금률은 "항상 손실을 줄이고 수익을 올리십시오"입니다.

높은 수학적 기대치를 바탕으로 수익을 내기 위해서는 좋은 거래의 세 가지 기본 원칙을 이해해야 합니다.

  1. 시장에 진입할 때 위험을 파악하십시오 (즉, 초기 손절매 값).
  2. 이익을 줄이고 이익이 계속 발생하도록 하십시오 (시스템에서 요구하기 전에 포지션을 청산하지 마십시오).
  3. 시스템의 수학적 기대치를 파악하고 정기적으로 테스트하고 조정하십시오.


이익을 실행할 수 있도록 하는 단계별 포지션 추적 방법

시장이 어디로 갈지 모르기 때문에 많은 사람들이 수익을 낼 수 없다고 생각합니다. 그러나 성공적으로 거래하려면 꼭 그것을 알아야 합니까? 성공적인 거래는 대부분 시장에 진입하기 위한 적절한 순간을 고려하여 적절하게 설계된 시스템을 기반으로 합니다. 이러한 고려는 기대의 힘과 이익이 가능한 한 가장 높은 수준으로 돌아갈 수 있도록 하는 단계별 포지션의 규칙을 사용하여 이루어집니다.

시장 진입 순간은 촛대 모형, 파동 모형 등 다양한 방법으로 찾을 수 있습니다. 동시에 손익 요소(손익 비율)를 고려해야 합니다.

이 방법은 다음 요구 사항을 기반으로 합니다. 거래자는 포지션을 열 때 가능한 가장 낮은 손절매 값을 선택합니다. 그 값은 다양한 방법을 사용하여 결정할 수 있습니다. 예를 들어 보증금의 1.5%와 같을 수 있습니다. 시장이 손절매 값과 같은 이익에 도달하면 랏의 절반이 닫히지만 손절매는 변경되지 않습니다!

따라서 우리는 시장이 반대 방향으로 갈 경우에 대비하여 일종의 안전망을 만듭니다. 즉, 최소 손실을 수정하여 위험을 줄입니다. 시장이 잠시 후 반등하기 위해 유리한 방향으로 움직인다면 손절매가 발동됩니다(그림 1-3).


그림 1. 포지션 개설


그림 2. 손절매 설정

시장이 다시 돌아간 경우:


그림 3. 시장이 역전하면 손익분기점 수준

포지션 후행 프로그램 코드

우리는 열린 포지션을 추적하고 두 번째 황금 원칙을 실현하는 프로그램 코드를 제공합니다. 이는 수익이 가능한 가장 높은 수준에서 실행될 수 있도록 해주기 때문입니다.

시장이 여전히 유리한 방향으로 움직이고 미리 결정된 값(예: 100핍)에 도달하면 손절매는 손익분기 수준으로 재설정됩니다. 미리 결정된 간격(예: 50핍)으로 이익에 도달하면 추가 재설정이 이루어집니다. 우리는 각 다음 바에서 손절매를 움직일 수 있지만 중개인은 빈번한 재설정을 좋아하지 않습니다. 특히 거래가 더 낮은 시간 프레임에 수행될 때 그렇습니다. 라이브러리 폴더의 오류 파일(stdlib.mq4)에도 정확히 그 경우에 해당하는 오류 # 8 error="too frequency requests"가 있습니다.

각각의 다음 손절매 수준을 결정하는 방법은 피보나치 수준에 따라 이익을 얻을 때의 가격 포지션에 의해 선택됩니다. 적용된 피보나치 수준은 여기에서 Vegas Tunnel 방법에 따라 구축됩니다.

피보나치 레벨 계산은 LevelFibo() 레벨 생성 함수에 의해 수행됩니다.

//+------------------------------------------------------------------+
   void LevelFibo()
   {
   double Fb1,Fb2,Fb3,Fb4,Fb5,Fb6,Fb7,Fb8,Fb9,Fb10,Fb11,Fb12,Fb13;
   // "Vegas" channel
   double Ma144_1 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   double Ma169_1 = iMA(NULL,0,169,0,MODE_EMA,PRICE_CLOSE,1);
   // "Vegas" channel median
   double MedVegas=NormalizeDouble((Ma144_1+Ma169_1)/2,Digits); 
   // calculate Fibo levels values using "Vegas" method
   Fb1=MedVegas-377*Point;     Fb12=MedVegas+377*Point;
   Fb2=MedVegas-233*Point;     Fb11=MedVegas+233*Point;
   Fb3=MedVegas-144*Point;     Fb10=MedVegas+144*Point;
   Fb4=MedVegas-89*Point;      Fb9=MedVegas+89*Point;
   Fb5=MedVegas-55*Point;      Fb8=MedVegas+55*Point;
   Fb6=MedVegas-34*Point;      Fb7=MedVegas+34*Point;
   }
//+------------------------------------------------------------------+
-->

BUY 포지션에 대한 손절매를 계산할 때 이익은 첫 번째 바의 최대 가격 High[1]와 포지션 개시 수준 OrderOpenPrice()의 차이입니다. 손절매 수준은 첫 번째 바 Low[1]의 최소값에 상대적인 "가장 가까운" 피보나치 수준으로 정의됩니다(그림 4).


그림 4. 매수 포지션에 대한 손절매 계산

SELL 포지션에 대한 손절매를 계산할 때 이익은 포지션 개시 레벨 OrderOpenPrice()와 첫 번째 바 High[1]의 최대 가격 사이의 차이입니다(그림 5).


그림. 5. 매도 포지션 에 대한 손절매 계산

매수 포지션의 경우 손절매 값은 Fibo 수준을 기반으로 합니다. 첫 번째 촛대의 가장 낮은 값에 따라 별도의 기능으로 제시됩니다.

기능 코드는 아래와 같습니다.

//+---------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for BUY position   |
//| by Fibo levels according to the lowest value of the first candle    |
//+---------------------------------------------------------------------+
 void StopLevelFiboBuy()
   {
   if(Low[1]>Fb12)                                newSL_B=Fb12-100*Point;
   if(Low[1]<=Fb12 && Low[1]>(Fb12+Fb11)/2)       newSL_B=(Fb12+Fb11)/2;
   if(Low[1]<=(Fb12+Fb11)/2 && Low[1]>Fb11)       newSL_B=Fb11;
   if(Low[1]<=Fb11 && Low[1]>(Fb11+Fb10)/2)       newSL_B=(Fb11+Fb10)/2;
   if(Low[1]<=(Fb10+Fb11)/2 && Low[1]>Fb10)       newSL_B=Fb10;
   if(Low[1]<=Fb10 && Low[1]>(Fb10+Fb9)/2)        newSL_B=Fb9;
   if(Low[1]<=(Fb10+Fb9)/2 && Low[1]>Fb9)         newSL_B=Fb8;
   if(Low[1]<=Fb9  && Low[1]>Fb8)                 newSL_B=Fb7;
   if(Low[1]<=Fb8  && Low[1]>Fb7)                 newSL_B=(Fb7+MedVegas)/2;
   if(Low[1]<=Fb7  && Low[1]>MedVegas)            newSL_B=Fb6;
   if(Low[1]<=MedVegas && Low[1]>(MedVegas+Fb6)/2)newSL_B=Fb6;
   if(Low[1]<=(MedVegas+Fb6)/2 && Low[1]>Fb6)     newSL_B=Fb5;
   if(Low[1]<=Fb6  && Low[1]>Fb5)                 newSL_B=Fb4;
   if(Low[1]<=Fb5  && Low[1]>Fb4)                 newSL_B=(Fb3+Fb4)/2;
   if(Low[1]<=Fb4  && Low[1]>Fb3)                 newSL_B=Fb3;
   if(Low[1]<=Fb3  && Low[1]>(Fb3+Fb2)/2)         newSL_B=(Fb3+Fb2)/2;
   if(Low[1]<=(Fb3+Fb2)/2  && Low[1]>Fb2)         newSL_B=Fb2;
   if(Low[1]<=Fb2  && Low[1]>(Fb2+Fb1)/2)         newSL_B=(Fb1+Fb2)/2;
   if(Low[1]<=(Fb2+Fb1)/2 && Low[1]>Fb1)          newSL_B=Fb1;
   if(Low[1]<=Fb1)                                newSL_B=Fb1-100*Point;
   }
//+------------------------------------------------------------------+
-->

매도 ​​포지션에 대한 첫 번째 StopLevelFiboSell() 함수 촛대의 최대 값에 따른 Fibo 수준별 손절매 값 테이블은 다음 코드로 표시됩니다.

//+----------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for SELL position   |
//| by Fibo levels according to the highest value of the first candle    |
//+----------------------------------------------------------------------+
 void StopLevelFiboSell()
   {
   if(High[1]<=Fb12 && High[1]>(Fb12+Fb11)/2)        newSL_S=Fb12+100*Point;
   if(High[1]<=Fb12 && High[1]>Fb11)                 newSL_S=Fb12;
   if(High[1]<=Fb11 && High[1]>Fb11+Fb10)            newSL_S=Fb11;
   if(High[1]<=Fb10 && High[1]>(Fb10+Fb9)/2)         newSL_S=(Fb11+Fb10)/2;
   if(High[1]<=Fb9  && High[1]>Fb8)                  newSL_S=(Fb10+Fb9)/2;
   if(High[1]<=Fb8  && High[1]>Fb7)                  newSL_S=Fb9;
   if(High[1]<=Fb7  && High[1]>MedVegas)             newSL_S=Fb8;
   if(High[1]<=MedVegas && High[1]>MedVegas)         newSL_S=Fb7;
   if(High[1]<=(MedVegas+Fb6)/2 && High[1]>Fb6)      newSL_S=MedVegas;
   if(High[1]<=Fb6  && High[1]>Fb5)                  newSL_S=MedVegas;
   if(High[1]<=Fb5  && High[1]>Fb4)                  newSL_S=Fb6;
   if(High[1]<=Fb4  && High[1]>Fb3)                  newSL_S=Fb5;
   if(High[1]<=Fb3  && High[1]>Fb2)                  newSL_S=Fb4;
   if(High[1]<=Fb2  && High[1]>(Fb2+Fb1)/2)          newSL_S=(Fb2+Fb3)/2;
   if(High[1]<(Fb2+Fb1)/2   && High[1]>Fb1)          newSL_S=Fb2;
   if(High[1]<Fb1)                                   newSL_S=(Fb2+Fb1)/2;
   }
//+------------------------------------------------------------------+
-->

언급된 두 종속성 함수 각각에 LevelFibo 피보나치 수준 계산 함수를 추가하는 것이 적절할 것입니다. 이는 첨부된 데모 파일에서 수행되었습니다.

이제 두 기능의 조합 또는 오히려 활성화 레벨 Fibo() 레벨 계산 기능에서 손절매 레벨의 식별 기능에 대해 이러한 레벨에 중점을 둡니다. 이 조합은 기능이 함께 작동하므로 의미가 있습니다. 따라서 후행 중 함수 호출 수가 줄어들고 둘 대신 하나만 남게 됩니다.

결합 후 다음과 같이 표시됩니다.

//+----------------------------------------------------------------------+
//| Function (table) for specifying Stop Loss values for BUY position    |
//| by Fibo levels according to the lowest value of the first candle     |
//+----------------------------------------------------------------------+
   void StoplevelFiboBuy()
   {
   double Fb1,Fb2,Fb3,Fb4,Fb5,Fb6,Fb7,Fb8,Fb9,Fb10,Fb11,Fb12,Fb13;
   double Ma144_1 = iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);
   double Ma169_1 = iMA(NULL,0,169,0,MODE_EMA,PRICE_CLOSE,1);
   double MedVegas=NormalizeDouble((Ma144_1+Ma169_1)/2,Digits); 
   Fb1=MedVegas-377*Point;     Fb12=MedVegas+377*Point;
   Fb2=MedVegas-233*Point;     Fb11=MedVegas+233*Point;
   Fb3=MedVegas-144*Point;     Fb10=MedVegas+144*Point;
   Fb4=MedVegas-89*Point;      Fb9=MedVegas+89*Point;
   Fb5=MedVegas-55*Point;      Fb8=MedVegas+55*Point;
   Fb6=MedVegas-34*Point;      Fb7=MedVegas+34*Point;
   if(Low[1]>Fb12)                                newSL_B=Fb12-100*Point;
   if(Low[1]<=Fb12 && Low[1]>(Fb12+Fb11)/2)       newSL_B=(Fb12+Fb11)/2;
   if(Low[1]<=(Fb12+Fb11)/2 && Low[1]>Fb11)       newSL_B=Fb11;
   if(Low[1]<=Fb11 && Low[1]>(Fb11+Fb10)/2)       newSL_B=(Fb11+Fb10)/2;
   if(Low[1]<=(Fb10+Fb11)/2 && Low[1]>Fb10)       newSL_B=Fb10;
   if(Low[1]<=Fb10 && Low[1]>(Fb10+Fb9)/2)        newSL_B=Fb9;
   if(Low[1]<=(Fb10+Fb9)/2 && Low[1]>Fb9)         newSL_B=Fb8;
   if(Low[1]<=Fb9  && Low[1]>Fb8)                 newSL_B=Fb7;
   if(Low[1]<=Fb8  && Low[1]>Fb7)                 newSL_B=(Fb7+MedVegas)/2;
   if(Low[1]<=Fb7  && Low[1]>MedVegas)            newSL_B=Fb6;
   if(Low[1]<=MedVegas && Low[1]>(MedVegas+Fb6)/2)newSL_B=Fb6;
   if(Low[1]<=(MedVegas+Fb6)/2 && Low[1]>Fb6)     newSL_B=Fb5;
   if(Low[1]<=Fb6  && Low[1]>Fb5)                 newSL_B=Fb4;
   if(Low[1]<=Fb5  && Low[1]>Fb4)                 newSL_B=(Fb3+Fb4)/2;
   if(Low[1]<=Fb4  && Low[1]>Fb3)                 newSL_B=Fb3;
   if(Low[1]<=Fb3  && Low[1]>(Fb3+Fb2)/2)         newSL_B=(Fb3+Fb2)/2;
   if(Low[1]<=(Fb3+Fb2)/2  && Low[1]>Fb2)         newSL_B=Fb2;
   if(Low[1]<=Fb2  && Low[1]>(Fb2+Fb1)/2)         newSL_B=(Fb1+Fb2)/2;
   if(Low[1]<=(Fb2+Fb1)/2 && Low[1]>Fb1)          newSL_B=Fb1;
   if(Low[1]<=Fb1)                                newSL_B=Fb1-100*Point;
   }
// ----------------------------------------------------------------------+
-->

포지션 후행의 주요 명령 코드는 현재 바의 가격 값에 따라 위에서 언급한 기능의 실행을 위한 일련의 작업과 함께 Expert Advisor 조각으로 표시됩니다. 적절한 미결 주문이 선택된 후 단계별 추적이 시작됩니다.

후행 코드의 작은 조각이 아래에 나와 있습니다.

//+------------------------------------------------------------------+
//| TRAILING OPEN POSITIONS                                          |
//+------------------------------------------------------------------+
for(int i=OrdersTotal()-1; i>=0; i--)
  {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {Print("Order selection error = ",GetLastError());}
   if(OrderSymbol()==Symbol())
     {
      if(OrderType()==OP_BUY)
        {
         if(OrderMagicNumber()==Magic)
           {
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=SL_B*Point && OrderLots()==0.2)Close_B_lot();
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())/Point>=100 && OrderLots()==0.1 && OrderStopLoss()<OrderOpenPrice())
              {
               Print(" 1 - StopLoss shift");
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+2*Point,OrderTakeProfit(),0,Aqua))
                 {
                  Print(" at Modif.ord.# ",OrderTicket()," Error # ",GetLastError());
                 }
               return;
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=120*Point && OrderOpenPrice()>Ma144_1-144*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+21*Point;
               if((Bid-newSL_B)/Point<StopLevel)newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print("2nd shift of StopLoss ");
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=200*Point && (High[1]-OrderOpenPrice())<=250*Point)
              {
               StoplevelFiboBuy();
               if((Bid-newSL_B)/Point<StopLevel)newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 3rd shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=250*Point && OrderOpenPrice()>Ma144_1-144*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+10*Point;
               if((Bid-newSL_B)/Point<StopLevel) newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 4th shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            if((High[1]-OrderOpenPrice())>=300*Point && (High[1]-OrderOpenPrice())<=350*Point)
              {
               StoplevelFiboBuy();
               newSL_B=newSL_B+20*Point;
               if((Bid-newSL_B)/Point<StopLevel) newSL_B=Bid-StopLevel*Point;
               if(newSL_B>OrderStopLoss() && (Bid-newSL_B)/Point>StopLevel)
                 {
                  Print(" 5th shift by level order # ",OrderTicket());
                  Modyf_B_lot();
                 }
              }
            // ----------------------------------------------------------------------+
            ...
           }
        }
     }
  }
-->

단계별 추적 시퀀스는 첨부된 데모 Expert Advisor 버전의 8단계로 구성됩니다.

아래는 매수 포지션 후행에 대한 데모 Expert Advisor의 작동 단계를 보여주는 스크린샷입니다. '삼초 흡수' 모델이 형성되었기 때문에 포지션이 열렸습니다. 게다가 흡수된 양초 중에는 '역망치'도 있습니다. 이러한 사실은 매수 포지션을 여는 신호의 강도를 강화합니다.


그림 6. 매수 포지션 후행의 예

"Vegas" 표시기는 가벼운 스크린샷과 같이 Fibo 라인을 보는 데 사용해야 합니다. MQL4 웹사이트에서 볼 수 있습니다: https://www.mql5.com/ko/code/7148

"어두운" 화면의 동일한 약간 늘어난 스크린샷:

그림 7. 모니터 화면의 스크린샷(구매용 데모 버전)

그림 8. 매도 포지션 후행의 예

임시 테스트 매개변수는 아래 그림 9-10과 같이 데모 Expert Advisors의 작업을 표시하기 위해 설치되어야 합니다.


그림 9. Demo_trail_Buy.mql Expert Advisor 테스트 매개변수


그림 10. Demo_trail_Sell.mql Expert Advisor 테스트 매개변수

참고: 데모 Expert Advisors가 포함된 파일은 후행 매수 및 매도 포지션을 위한 미니 로봇으로 글에 첨부됩니다. 포지션은 여기에서 이중 랏에서 열립니다. 그러나 손절매가 손익분기점으로 이동하면 미래의 가격 움직임이 올바른 방향으로 움직일 것이라는 확신이 생기고 다른 포지션을 추가할 수 있습니다.


결론

주문 후행의 제시된 예는 Fibo 동적 수준에 초점을 맞춘 손절매 주문 이동 방법이 긍정적인 결과를 가져올 수 있음을 보여줍니다. 설명된 방법은 거래에서 실제 사용을 위해 권장할 수 있습니다.

기능을 식별하는 동적 Fibo 수준:

  • LevelFiboKgd.mq4
  • StopLevelFiboBuy.mq4
  • StopLevelFiboSell.mq4
  • 데모 파일:
  • Demo_trail_Buy_v1.mq4 – 구매를 위한 데모 파일
  • Demo_trail_Sell_v1.mq4 - 판매용 데모 파일


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/1349

기술적 분석 및 시장 예측 방법에 관하여 기술적 분석 및 시장 예측 방법에 관하여
이 글은 시각적 사고 및 "즉시 사용 가능한" 시장 전망과 결합된 잘 알려진 수학적 방법의 기능과 잠재력을 보여줍니다. 한편으로는 트레이딩 패러다임 자체를 재고할 수 있는 창의적인 마인드를 가질 수 있어 폭넓은 청중의 이목을 집중시키는 역할을 합니다. 그리고 다른 한편으로는 분석 및 예측을 위한 광범위한 도구와 관련된 대안 개발 및 프로그램 코드 구현을 야기할 수 있습니다.
Expert Advisor 매개변수 선택을 위한 테스트(최적화) 기술 및 일부 기준 Expert Advisor 매개변수 선택을 위한 테스트(최적화) 기술 및 일부 기준
시험의 성배 (Holy Grail)를 찾는 데는 문제가 없지만 제거하는 것은 훨씬 더 어렵습니다. 이 글에서는 터미널 성능 기능을 최대한 활용하고 최종 사용자 부하를 최소화할 때 최적화 및 테스트 결과의 자동화된 그룹 처리를 통해 Expert Advisor 작동 매개변수 선택에 대해 설명합니다.
MQL5 Cookbook: ОСО 주문 MQL5 Cookbook: ОСО 주문
모든 거래자의 거래 활동에는 주문 간의 관계를 비롯한 다양한 메커니즘과 상호 관계가 포함됩니다. 이 글은 OCO 주문 처리의 솔루션을 제안합니다. 표준 라이브러리 클래스가 광범위하게 관련되어 있으며 여기에서 새로운 데이터 유형이 생성됩니다.
CCanvas 클래스 공부하기. 투명 개체를 그리는 방법 CCanvas 클래스 공부하기. 투명 개체를 그리는 방법
이동 평균의 어색한 그래픽 이상이 필요하십니까? 터미널에 채워진 단순한 직사각형보다 더 아름다운 것을 그리고 싶습니까? 터미널에서 매력적인 그래픽을 그릴 수 있습니다. 이것은 사용자 정의 그래픽을 만드는 데 사용되는 CСanvas 클래스를 통해 구현할 수 있습니다. 이 클래스를 사용하면 투명도를 구현하고 색상을 혼합하고 색상을 겹치고 혼합하여 투명도의 환상을 만들 수 있습니다.