기고글 토론 "마켓에 제품 출시하기" - 페이지 48

 

내 EA가 새 상품을 등록할 때 오류를 반환합니다:

EURUSD,H1(네팅) 테스트 2020.04.15 15:47:05 실패 #44 매도 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [주문 또는 포지션이 시장에 근접하여 수정에 실패함]

하지만 내 EA는 외환이 아닌 WIN$에서 실행되도록 되어 있습니다. 테스터가 실행할 자산을 알려주지 않는 이유는 무엇인가요?

EA가 완벽하게 실행되고 있는데 어떻게 오류를 수정할 수 있나요? 제품을 판매용으로 등록할 수 없습니다.

 
Adriano De Mello Moura #:

새 제품을 등록할 때 내 EA가 오류를 반환합니다:

EURUSD,H1 (네팅) 테스트 2020.04.15 15:47:05 실패 #44 매도 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [주문 또는 포지션이 시장에 근접하여 수정에 실패함]

하지만 내 EA는 외환이 아닌 WIN$에서 실행되도록 되어 있습니다. 테스터가 실행할 자산을 알려주지 않는 이유는 무엇인가요?

EA가 완벽하게 실행되고 있는데 어떻게 오류를 수정할 수 있나요? 제품을 판매용으로 등록할 수 없습니다.

로봇은 모든 자산에서 작동할 준비가 되어 있어야 합니다....


위에서 언급한 오류를 수정하려면 포지션을 수정하기 전에 아래 점검을 수행해야 합니다:

//+--------------------------------------------------------------------------------------------------------------------+
//| 테이크프로핏/손절매와 종가 사이의 거리가 SYMBOL_TRADE_STOPS_LEVEL |보다 큰지 확인합니다.
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- 로컬 변수
   bool SL_check = false, TP_check = false;

//--- 현재 심볼의 마지막 가격을 결정합니다.
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- SYMBOL_TRADE_STOPS_LEVEL 레벨을 가져옵니다.
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- 두 가지 주문 유형만 확인
   switch(type)
     {
      //--- 구매 작업
      case  ORDER_TYPE_BUY:
        {
         //--- 스톱로스 확인
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- 테이크프로핏 확인
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- 검사 결과를 반환합니다.
         return(SL_check && TP_check);
        }
      //--- 판매 작업
      case  ORDER_TYPE_SELL:
        {
         //--- 스톱로스 확인
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- 테이크프로핏 확인
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- 검사 결과를 반환합니다.
         return(TP_check && SL_check);
        }
      break;
     }

//--- 확인 성공
   return(false);
  }



아래 문서에서 로봇이 수행해야 하는 다른 점검 사항을 확인하세요:

트레이딩 로봇이 마켓에 게시되기 전에 통과해야 하는 테스트 - MQL5 문서

 

안녕하세요, 이전 제품 중 하나에서 제품 설명을 편집할 수 없습니다.

설명을 새로 작성하거나 마켓에서 숨기는 등 다양한 포럼의 지침을 따랐지만 설명이 여전히 원래 버전으로 되돌아갑니다.

이제 더 이상 마켓플레이스에서 제품을 복원할 수도 없고 편집할 수도 없습니다. 이 문제와 관련된 포럼에서 도움을 요청했지만 아직까지 아무런 도움을 받지 못했습니다.

"제품 설명을 편집할 수 없습니다." 이 문제를 해결하려면 어떻게 해야 하나요? 도와주세요

 

Expert Advisor를 로드하고 테스트할 때 오류가 기록되는데 어떻게 수정해야 할지 모르겠습니다.

EURUSD,H1(네팅) 테스트

2020.04.14 00:24:42 1.09044에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.14 00:24:45 1.09044에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.14 00:24:48 1.09037에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.21 00:01:34 1.08626에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.21 00:01:37 1.08626에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.21 00:01:40 1.08626에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.04.27 16:08:24 1.08546에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.04.27 16:08:27 1.08548에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.04.27 16:08:30 1.08547에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.04.29 20:15:52 1.08565에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.04.29 20:15:55 1.08566에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.04.29 20:15:58 1.08566에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.05.18 00:12:09 1.08134에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.05.18 00:12:12 1.08134에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.05.18 00:12:15 1.08143에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.05.21 15:50:25 1.10031에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.05.21 15:50:28 1.10034에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.05.21 15:50:31 1.10036에 0.01 EURUSD 즉시 매도 실패 [잘못된 거래량]

2020.05.25 19:00:05 1.08950에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.05.25 19:00:08 1.08951에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

2020.05.25 19:00:11 1.08952에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

거래가 없습니다.

 
Kirill Voytseshchuk #:

Expert Advisor를 로드하고 테스트할 때 오류가 기록되면 이를 수정하는 방법이 명확하지 않습니다.

EURUSD,H1(네팅) 테스트

2020.04.14 00:24:42 1.09044에 0.01 EURUSD 즉시 매수 실패 [잘못된 거래량]

***

전체 오류 메시지를 읽어주세요 - "어떤 검사가 통과해야 하는지..." 문서에 대한 링크가 있습니다.
 

읽고 코드에 입력하세요

거래 작업에서 잘못된 거래량

거래 주문을 보내기 전에 주문에 지정된 거래량이 정확한지 확인해야 합니다. 주문에 지정할 랏 수는 주문Send() 함수를 호출하기 전에 확인해야 합니다. 금융 상품의 경우 지정가에는 거래에 허용되는 최소 및 최대 거래량과 거래량 그라데이션이 지정되어 있습니다. MQL5에서는SymbolInfoDouble() 함수를 사용하여 ENUM_SYMBOL_INFO_DOUBLE 열거형에서 이러한 값을 가져올 수 있습니다.

//+------------------------------------------------------------------+
//| 주문량이 정확한지 확인합니다 ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 거래 작업에 허용되는 최소 거래량
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("허용되는 최소 볼륨보다 적은 볼륨 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 거래 작업에 허용되는 최대 거래량
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("허용된 최대 볼륨보다 큰 볼륨 SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 최소 볼륨 그라데이션 가져오기
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("볼륨이 최소 등급 SYMBOL_VOLUME_STEP=%.2f의 배수가 아니며, 가장 가까운 올바른 볼륨은 %.2f입니다.",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="올바른 볼륨 값";
   return(true);
  }

도움이 되지 않았는데 다른 코드를 수정할 수 있나요?

스크립트를 개선하는 방법을 알려주실 수 있나요?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

읽고 코드에 입력하세요.

거래 작업에서 잘못된 거래량

거래 주문을 보내기 전에 주문에 지정된 거래량이 정확한지 확인해야 합니다. 주문에 지정할 랏 수는 주문Send() 함수를 호출하기 전에 확인해야 합니다. 금융상품의 경우사양은 거래에 허용되는 최소 및 최대 거래량과 거래량 그라데이션을 지정합니다 . 이러한 값은 MQL5에서SymbolInfoDouble() 함수를 사용하여 ENUM_SYMBOL_INFO_DOUBLE 열거형에서 얻을 수 있습니다.

도움이 되지 않았는데 다른 코드를 수정할 수 있나요?

스크립트를 수정하는 방법을 알려주실 수 있나요?

기사를 완전히 읽으십시오. 'CheckVolumeValue'는 입력 매개 변수의 정확성을 확인하는 것입니다.

그리고 올바른 로트 반올림 검사도 있습니다 ...

 

오픈 포지션의 거래량과 지정가 주문의 거래량을 고려하면 최종 확인은 다음과 같이 표시됩니다:

//+------------------------------------------------------------------+
//| 기호별로 주문에 허용되는 최대 거래량을 반환합니다.
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- 주문에서 최대 볼륨 제한을 가져옵니다.
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- 볼륨의 글자 수 제한 가져오기
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- 기호별로 오픈 포지션의 볼륨을 가져옵니다.
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- 이미 볼륨을 모두 소진한 경우
      if(max_volume-opened_volume<=0)
         return(0);

      //--- 오픈 포지션 볼륨이 최대 볼륨을 초과하지 않습니다.
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

add?

체크볼륨값.mq5와 같이 작성됩니다.


//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

볼륨 그라데이션에 포함된 소수점 이하 자릿수 찾기 //--- 볼륨 그라데이션에 포함된 소수점 이하 자릿수 찾기
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- 루프에서 다양한 볼륨 값을 확인합니다.
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("검사 결과",volume,": ",descr);
        }
        else PrintFormat("%G 볼륨이 맞습니다.",volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| 주문량이 정확한지 확인합니다 ||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 거래 작업에 허용되는 최소 거래량
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("허용되는 최소 볼륨보다 적은 볼륨 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 거래 작업에 허용되는 최대 거래량
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("허용된 최대 볼륨보다 큰 볼륨 SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 최소 볼륨 그라데이션 가져오기
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("볼륨이 최소 등급 SYMBOL_VOLUME_STEP=%.2f의 배수가 아니며, 가장 가까운 올바른 볼륨은 %.2f입니다.",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description="올바른 볼륨 값";
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk 주문의 거래량을 고려하면 최종 확인은 다음과 같이 표시됩니다:

추가?

체크볼륨값.mq5와 같이 작성됩니다.


필요한 모든 검사는 EA 생성을 위한 거의 생성자 문서에 있습니다.

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

앞서 질문한 코드가 적합한가요?

문서에서 필요한 줄을 작성할 수 있습니다.