MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1831

 
Mihail Matkovskij # :

가격이 TP 방향으로 갔다면 추적이 트리거되어야 하고 가격이 롤백되면 아무 것도 하지 않습니다. 이 경우 SL 레벨은 롤백되지 않고 TP 방향으로만 이동해야 합니다.

알아요

나는 썼다

스톱의 순간적인 움직임이 있고 무한한 횟수가 걸립니다

2021.12.23 21:07:51.634 2021.12.21 12:12:20 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:20 111 AUDUSD,M15: #2 수정 0.02 AUDUSD에서 0.71028 sl: 0.71288 tp: 0.72038 확인

2021.12.23 21:07:51.634 2021.12.21 12:12:18 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:18 111 AUDUSD,M15: #2 수정 0.71028 sl: 0.71268 tp: 0.72018 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:16 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:16 111 AUDUSD,M15: #2 수정 0.71028 sl: 0.71248 tp: 0.71998 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:15 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:15 111 AUDUSD,M15: #2 수정 0.02 AUDUSD에서 0.71028 sl: 0.71228 tp: 0.71978 확인

2021.12.23 21:07:51.634 2021.12.21 12:12:13 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:13 111 AUDUSD,M15: #2 수정 0.71028 sl: 0.71208 tp: 0.71958 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:11 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:11 111 AUDUSD,M15: #2 수정 0.71028 sl: 0.71188 tp: 0.71938 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:10 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:10 111 AUDUSD,M15: #2 수정 0.71028 sl: 0.71168 tp: 0.71918 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:08 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:08 111 AUDUSD,M15: #2 수정 0.02 AUDUSD에서 0.71028 sl: 0.71148 tp: 0.71898 확인

2021.12.23 21:07:51.634 2021.12.21 12:12:06 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:06 111 AUDUSD,M15: 수정 #2 0.71028 sl: 0.71128 tp: 0.71878 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:05 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:05 111 AUDUSD,M15: 수정 #2 0.71028 sl: 0.71108 tp: 0.71858 ok에서 0.02 AUDUSD 구매

2021.12.23 21:07:51.634 2021.12.21 12:12:00 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:12:00 111 AUDUSD,M15: #2 수정 0.02 AUDUSD에서 0.71028 sl: 0.71088 tp: 0.71838 확인

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: 구매 주문 수정 성공!

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: #2 수정 0.02 AUDUSD에서 0.71028 sl: 0.71068 tp: 0.71818 확인

2021.12.23 21:07:51.634 2021.12.21 12:11:52 111 AUDUSD,M15: 구매 주문 수정 성공!


 
законопослушный гражданин # :

알아요

나는 썼다

스톱의 순간적인 움직임이 있고 무한한 횟수가 걸립니다

수정된 주문의 SL을 가져와서 계산된 SL과 비교해야 합니다. 동일하면 로봇은 계산된 SL이 처리된 주문의 SL을 초과할 때까지 아무 작업도 수행하지 않아야 합니다. 두 개의 이중 값을 비교하는 방법: NodmalizeDouble(value, Digits)(각 값의) 또는 EqualDoubles https://www.mql5.com/en/docs/basis/types/double 을 비교합니다.

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
законопослушный гражданин # :

알아요


당신은 그것을 올바르게 배치했습니다. TrailingOrders() 함수 내에서 무언가를 변경했습니까?

 
Mihail Matkovskij # :

수정된 주문의 SL을 가져와서 계산된 SL과 비교해야 합니다. ...

일반적으로 규칙은 다음과 같습니다.

  • 예상 SL은 주문의 SL보다 작음(수익성이 낮음) - 아무것도 하지 않음
  • 예상 SL은 주문의 SL과 같습니다. 아무 것도 하지 않음
  • 예상 SL이 주문의 SL을 초과했습니다(더 수익성 있음) - 계산된 값으로 SL 수정
트롤 건설에 대한 이러한 규칙은 SL 수준을 계산하기 위한 알고리즘을 사용하여 거의 모든 트롤을 만드는 데 적합합니다.
 
Tretyakov Rostyslav # :

당신은 그것을 올바르게 배치했습니다. TrailingOrders() 함수 내에서 무언가를 변경했습니까?

변경하고 "있는 그대로" 넣어도 결과는 동일했습니다.

 
законопослушный гражданин # :

변경하고 "있는 그대로" 넣어도 결과는 동일했습니다.

입력 매개변수를 확인해야 합니다. 로그로 판단하면 트롤이 올바르게 작동하고 있습니다.
 
Tretyakov Rostyslav # :
입력 매개변수를 확인해야 합니다. 로그로 판단하면 트롤이 올바르게 작동하고 있습니다.

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - 복사 입력: Lot=0.01; 손절매 = 200; 테이크프로핏=560; 미끄러짐=3; 마법=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; 주문 닫기=3; 주문닫기2=5; DigitLot=2; 기간MA=21; 이동시프트=1;


 
законопослушный гражданин # :

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - 복사 입력: Lot=0.01; 손절매 = 200; 테이크프로핏=560; 미끄러짐=3; 마법=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; 주문 닫기=3; 주문닫기2=5; DigitLot=2; 기간MA=21; 이동시프트=1;


코드에 함수를 잘못 넣었을까요?

 void OnTick ()
  {
// Получим значение индикатора
   dMA = iMA ( Symbol (), 0 ,PeriodMA, MovingShift, MODE_SMA , PRICE_CLOSE , 0 ); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   TrailingOrders();
// Если нет открытых ордеров, то входим в условие
       if (CountOrders()== 0 )
     {

// Если появился сигнал на покупку, то откроем ордер на покупку
       if (bSignalBuy() == true )
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
       if (bSignalSell() == true )
         vOrderOpenSell();
     } 
       DrawLABEL( "nextlot" , 1 , 5 , 0 ,Color1(), StringConcatenate ( "CURRENT LOT: " ,DoubleToStr(LOT(), 2 )));
       DrawLABEL( "currentlot" , 1 , 5 , 0 ,Color2(), StringConcatenate ( "NEXT LOT: " ,DoubleToStr(LOT(), 2 ))); 
  }

함수 자체를 별도로 두십시오.

 //-------------------------------------------------------------------+

void TrailingOrders()
  {
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY)
              {
               if (Bid >= OrderOpenPrice()+(TakeProfit* 0.75 * _Point ) && OrderStopLoss()<OrderOpenPrice()- 20 * _Point )
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+ 20 * _Point , OrderTakeProfit()+ 20 * _Point , 0 ))
                     Print ( "Модификации ордера на покупку успешна!" );
                   else
                     Print ( "Ошибка модификации ордера на покупку! - " , GetLastError ());
                 }
               if (Bid >= OrderOpenPrice()+(TakeProfit* 0.9 * _Point ) && OrderStopLoss()>=OrderOpenPrice()- 20 * _Point )
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+ 30 * _Point , OrderTakeProfit()+ 10 * _Point , 0 ))
                     Print ( "Модификации ордера на покупку успешна!" );
                   else
                     Print ( "Ошибка модификации ордера на покупку! - " , GetLastError ());
                 }
              }
           }
        }
     }
  }
 
законопослушный гражданин # :

코드에 함수를 잘못 넣었을까요?

함수 자체를 별도로 두십시오.

 //-------------------------------------------------------------------+

void TrailingOrders()
  {
   
   for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
     {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == Symbol () && OrderMagicNumber() == Magic)
           {
             if (OrderType() == OP_BUY)
              {
               if (Bid >= OrderOpenPrice()+(TakeProfit* 0.75 * _Point ) && OrderStopLoss()<=OrderOpenPrice()-StopLoss* _Point )
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-(StopLoss+ 20 )* _Point , OrderTakeProfit()+ 20 * _Point , 0 ))
                     Print ( "Модификации ордера на покупку успешна!" );
                   else
                     Print ( "Ошибка модификации ордера на покупку! - " , GetLastError ());
                 }
               if (Bid >= OrderOpenPrice()+(TakeProfit* 0.9 * _Point ) && OrderStopLoss()>=OrderOpenPrice()-(StopLoss+ 20 )* _Point )
                 {
                   if (OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+ 30 * _Point , OrderTakeProfit()+ 10 * _Point , 0 ))
                     Print ( "Модификации ордера на покупку успешна!" );
                   else
                     Print ( "Ошибка модификации ордера на покупку! - " , GetLastError ());
                 }
              }
           }
        }
     }
  }

트롤이 올바르게 서 있습니다.

이 시도

 
Tretyakov Rostyslav # :

트롤이 올바르게 서 있습니다.

이 시도

우주로 날아가다

먼저 정지한 다음 테이크 후 즉시 우주로 날아갑니다(주문 종료).

내가 이해하는 한 그것은 요점이 아닙니다.

내가 틀렸다면 정정해 주세요: void OnTick()

미결 주문이 없고 신호가 있는 경우 vOrderOpenBuy() / vOrderOpenSell()

그런 다음 void vOrderModify(int iOTi)가 옵니다. 즉, 중지 및 테이크가 설정된 다음 오류 검사가 수행됩니다. 모두.

즉, 실제로 주문이 스톱 또는 테이크에 의해 마감될 때까지 후행 측면에서 어떤 식으로든 이를 수정할 수 없습니다.

예, 실제로 필요하지 않습니다. 스톱과 테이크를 한 번(최대 두 번) 여러 번 움직여야 합니다.

나는 여러 트레일 어드바이저를 분석했습니다. 모든 계획은 귀하와 거의 동일합니다.

어떻게 구현할지 아직 고민 중입니다.

파일:
111.mq4  25 kb