고문 개선 전략 - 페이지 5

 
https://www.mql5.com/ru/code/7108 트롤에 대한 흥미로운 자료도 있습니다.
 

3. 후행 표준 - '계단'.

 void TrailingStairs ( int ticket , int trldistance , int trlstep )

이 유형의 후행은 표준을 수정한 것입니다. 내가 틀리지 않았다면, 한 번에 KimIV 가 비슷한 것을 작성했습니다 (하지만 "더 친절"하기 때문에 ... :) 손절매가 "포인트"로 전송되지 않는다는 점에서 표준 후행과 다릅니다. 예를 들어, +31에서 30포인트의 거리에서 후행할 때 정지 손실은 +1만큼, +32에서 - +2 등으로 이동하지만 지정된 길이의 "단계"만큼 이동합니다(예: 후행할 때 40 포인트의 거리와 10의 "단계"에서 +40에 도달하면 손절매가 +10으로 이동하고 이익이 +50(40p. + 단계)에 도달할 때까지 아무 것도 변경되지 않습니다(따라서 우리는 실제로이 알고리즘의 본질 인 특정 자유에 가격을 매기고 +10에서 + 50 정지 손실에서만 +10에서 +20으로, +60에서 +30 포인트로 이동합니다. , 등.

옵션:
티켓 -
고유 주문 번호( OrderSelect() 를 사용하여 함수를 호출하기 전에 선택됨);
trldistance - 우리가 "추적"하는 현재 속도(포인트)로부터의 거리(MarketInfo(Symbol(),MODE_STOPLEVEL) 이상);
trlstep - 손실 변경 "단계"(포인트)를 중지합니다 (1 이상).

trlstep = 1일 때 이 기능은 표준 후행과 다르지 않습니다. 이 알고리즘의 주요 "기능"은 환율에 "이동의 자유"를 제공하는 것입니다. 가격이 "방황하고 결정한" 후에만 손절매가 강화됩니다. V. Barishpolts가 이미 언급한 "슬라이딩 채널" 전술의 규칙에 대한 설명에서 이 후행 알고리즘 을 처음 만났습니다.

==================

이것은 고문에서 흥미 롭습니다.

 
//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ                                |
//| Функции передаётся тикет позиции, расстояние от курса открытия,  |
//| на котором трейлинг запускается (пунктов) и "шаг", с которым он  |
//| переносится (пунктов)                                            |
//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д.        |
//+------------------------------------------------------------------+
 
void TrailingStairs( int ticket, int trldistance, int trlstep)
   { 
   
   double nextstair; // ближайшее значение курса, при котором будем менять стоплосс
 
   // проверяем переданные значения
   if ((trldistance<MarketInfo( Symbol (),MODE_STOPLEVEL)) || (trlstep< 1 ) || (trldistance<trlstep) || (ticket== 0 ) || (! OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
       Print ( "Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов." );
       return ( 0 );
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
       // расчитываем, при каком значении курса следует скорректировать стоплосс
       // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
       if ((OrderStopLoss()== 0 ) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance* Point ;
         
       // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
       else
      nextstair = OrderStopLoss() + trldistance* Point ;
 
       // если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
       if (Bid>=nextstair)
         {
         if ((OrderStopLoss()== 0 ) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep* Point <Bid-MarketInfo( Symbol (),MODE_STOPLEVEL)* Point )) 
            {
             if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep* Point ,OrderTakeProfit(),OrderExpiration()))
             Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
            }
         }
       else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep* Point ,OrderTakeProfit(),OrderExpiration()))
         Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
         }
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
       // расчитываем, при каком значении курса следует скорректировать стоплосс
       // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
       if ((OrderStopLoss()== 0 ) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo( Symbol (),MODE_SPREAD))* Point ;
      
       // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
       else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo( Symbol (),MODE_SPREAD))* Point ;
       
       // если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
       if (Ask<=nextstair)
         {
         if ((OrderStopLoss()== 0 ) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo( Symbol (),MODE_SPREAD))* Point >Ask+MarketInfo( Symbol (),MODE_STOPLEVEL)* Point ))
            {
             if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo( Symbol (),MODE_SPREAD))* Point ,OrderTakeProfit(),OrderExpiration()))
             Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
            }
         }
       else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo( Symbol (),MODE_SPREAD))* Point ,OrderTakeProfit(),OrderExpiration()))
         Print ( "Не удалось модифицировать стоплосс ордера №" ,OrderTicket(), ". Ошибка: " , GetLastError ());
         }
      }      
   }

대신 붙여 넣을 전체 코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
void TrailingStairs( int ticket, int trldistance)
   {
     int Spred=Ask - Bid;
     if (OrderType()==OP_BUY)
      {
       if ((Bid-OrderOpenPrice())>( Point *trldistance))
         {
           if (OrderStopLoss()<Bid- Point *trldistance || (OrderStopLoss()== 0 ))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid- Point *trldistance,OrderTakeProfit(), 0 ,Green);
             if (PolLots)
             if ( NormalizeDouble (OrderLots()/ 2 , 2 )>MarketInfo( Symbol (), MODE_MINLOT))
               {
               OrderClose(ticket, NormalizeDouble (OrderLots()/ 2 , 2 ),Ask, 3 ,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask, 3 ,Green);
               }
            }
         }
       }
     else
       {
         if ((OrderOpenPrice()-Ask)>( Point *trldistance))
          {
           if ((OrderStopLoss()>(Ask+ Point *trldistance)) || (OrderStopLoss()== 0 ))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+ Point *trldistance,OrderTakeProfit(), 0 ,Red);
             if (PolLots)
             if ( NormalizeDouble (OrderLots()/ 2 , 2 )>MarketInfo( Symbol (), MODE_MINLOT))
               {
               OrderClose(ticket, NormalizeDouble (OrderLots()/ 2 , 2 ),Bid, 3 ,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid, 3 ,Green);
               }
             }
          }
        }
    }


이것

 

원하는 어드바이저 수정을 시작하고 자신의 어드바이저에 삽입하지 않는 것이 좋습니다. 결과는 거의 같지만 문제는 더 적습니다.

또한 ALIEN 코드를 읽고 이해하는 능력은 매우 유용합니다 ...

 
ktest0 :

원하는 어드바이저 수정을 시작하고 자신의 어드바이저에 삽입하지 않는 것이 좋습니다. 결과는 거의 같지만 문제는 더 적습니다.

또한 ALIEN 코드를 읽고 이해하는 능력은 매우 유용합니다 ...

그가 갖고 싶어도 가질 수 없는 동안!
 
borilunad :
그가 갖고 싶어도 가질 수 없는 동안!

))) 모두가 이것으로 시작합니다 ... 그리고 나서-숲으로 더 멀리 갈수록 더 두꺼운 당파 ...
 

어드바이저에 코드 작성법을 찻주전자에 알려주세요,
특정 기간(예: 10.45 - 11.15) 동안 고가와 저가를 형성하는 것은 무엇입니까?

그래서 이 시간에 어드바이저를 켰다.즉, 나는 9시에 단말기를 켠다 -> 시간이 10시 45분에 그가 켜고 추적을 시작한다.이 라인에서 멀지 않은 낮고 대기중인 주문.

답변에 미리 감사드립니다.

 
글쎄, 당신은 고문을 비틀 수 있습니다 ....
 

트렐링이 어떻게 연결되어 있는지 이해가 되지 않습니다.

결국, 실제로 작동해야합니다.

 
IRIP :

트렐링이 어떻게 연결되어 있는지 이해가 되지 않습니다.

결국, 실제로 작동해야합니다.


"그냥 일하세요" 아무도, 아무것도 하지 않을 것입니다.

이 특정 흔적이 무엇을 찾고 있는지, 어떤 조건에서, 어떤 단계로, 어떤 추가 조건이 있는지 분석해야 합니다.

트롤 코드를 분해하면 모든 것이 명확해 지지만 "눈이 뻑뻑하다"는 원칙은 좋은 결과로 이어지지 않습니다....