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

 
Valeriy Yastremskiy :

하루에 1440개의 주문이 있는 경우 1분의 시작 또는 더 간단하게는 분 표시줄의 모양에 대한 확인이 있어야 합니다. 그리고 이 순간에 열립니다. 당신은 그것을 가지고 있지 않으므로 고문은 현재 견적에서 우리 기호의 조건에 따라 그 자체로 힘든 조건인 각 틱에 대한 포지션을 엽니다. 이 조건은 충족되거나 충족되지 않을 수 있으며 틱은 건너뜁니다. 그리고 어느 시점에서 치명적인 오류가 발생합니다.

또한, 주문 실행 의 유형(주문을 체결하여 포지션을 생성) All or nothing.

이해했다. 도와 주셔서 감사합니다.

어드바이저가 이렇게 많은 주문을 여는 것은 어렵다는 생각이 문득 들었다. 이 코드로 주문 수를 제한하려고 했습니다.

 MqlDateTime time_now;
TimeCurrent (time_now);
if (time_now.hour== 10&&&&time_now.min==0 )
{
// открыть ордер
}

즉, 10:00에만 주문을 엽니다. 그러나 결과는 동일합니다.

2020.10.27 10:25:17.548 코어 1 36Mb의 히스토리 데이터, 64Mb의 틱 데이터를 포함하여 272Mb 메모리 사용


 input int       StopLoss= 30 ;       // Stop Loss
input int       TakeProfit= 100 ;   // Take Profit
input double    Lot= 0.1 ;           // Количество лотов для торговли
int A;     //

//+------------------------------------------------------------------+
void OnTick ()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
    MqlDateTime time_now;      // Будет использоваться для
   
 TimeCurrent (time_now);   
 if (! SymbolInfoTick ( _Symbol ,latest_price))
 if (time_now.hour== 10 &&time_now.min== 0 )
   {
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.bid, _Digits );           // последняя цена Bid
         mrequest.sl = NormalizeDouble (latest_price.ask + StopLoss* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble (latest_price.ask - TakeProfit* _Point , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = Lot;                                                 // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL ;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING _RETURN ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 100 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend (mrequest,mresult);
    }   
     return ;
  }

내가 무엇을 잘못하고 있지?

내가 추가하고 변경한 코드를 강조 표시

다음은 로그 파일에 기록된 내용입니다.

FD 0 10:57:05.453 코어 1 에이전트 프로세스가 127.0.0.1:3000에 시작되었습니다.

CS 0 10:57:05.453 코어 1 127.0.0.1:3000에 연결

JD 0 10:57:05.953 코어 1 연결된

외경 0 10:57:05.975 코어 1 승인됨(에이전트 빌드 2650)

제이엘 0 10:57:05.980 시험 장치 EURUSD,M1(Alpari-MT5-Demo): Experts\GRAIL.ex5 테스트 2020.09.01 00:00 ~ 2020.09.10 00:00

켜짐 0 10:57:05.997 코어 1 공통 동기화 완료

CJ 0 10:57:06.223 시험 장치 분석된 이력의 품질은 100%입니다.

LM 0 10:57:06.248 코어 1 MetaTester 5는 127.0.0.1:3000에 시작되었습니다.

EJ 0 10:57:06.248 코어 1 초기화 완료

엘에스 0 10:57:06.248 코어 1 로그인(빌드 2650)

0 10:57:06.248 코어 1 4372바이트의 계정 정보가 로드됨

0 10:57:06.248 코어 1 1482바이트의 테스터 매개변수 로드됨

에프엔 0 10:57:06.248 코어 1 1724바이트의 입력 매개변수 로드됨

확인 0 10:57:06.248 코어 1 423바이트의 기호 목록 로드(72개 기호)

0 10:57:06.248 코어 1 전문가 파일 추가됨: Experts\GRAIL.ex5. 13680바이트 로드됨

CP 0 10:57:06.248 코어 1 4077Mb 사용 가능, 틱 생성을 위해 50블록 설정

0 10:57:06.248 코어 1 핍으로 이익 계산, 초기 예치금 10000, 레버리지 1:100

LP 0 10:57:06.248 코어 1 성공적으로 초기화

R.I. 0 10:57:06.248 코어 1 15Kb의 총 초기화 데이터 수신

DN 0 10:57:06.248 코어 1 인텔 코어 i5-6400 @ 2.70GHz, 7883MB

IG 0 10:57:06.248 코어 1 EURUSD: 동기화할 기호

RS 0 10:57:06.248 코어 1 EURUSD: 동기화된 기호, 3720바이트의 기호 정보 수신됨

0 10:57:06.248 코어 1 EURUSD: 0:00:00.003에 동기화할 기록 데이터 27바이트 로드

EK 0 10:57:06.248 코어 1 EURUSD: 2019.01.02에서 2020.10.23까지 동기화된 기록

LK 0 10:57:06.248 코어 1 EURUSD,M1: 628432개의 막대에 할당된 기록 캐시 및 2019.01.02 06:00에서 2020.08.31 23:59까지 막대 619175개 포함

엘에이치 0 10:57:06.248 코어 1 EURUSD,M1: 역사는 2019.01.02 06:00부터 시작됩니다

LN 0 10:57:06.248 코어 1 EURUSD,M1(Alpari-MT5-Demo): OHLC 막대 상태 생성. 막대 시작에서만 실행되는 OnTick

제이엠 0 10:57:06.248 코어 1 EURUSD,M1: 2020.09.01 00:00부터 2020.09.10 00:00까지 Experts\GRAIL.ex5 테스트 시작: 입력:

엘에스 0 10:57:06.248 코어 1 손절매=30

PL 0 10:57:06.248 코어 1 테이크프로핏=100

FJ 0 10:57:06.248 코어 1 로트=0.1

디피 0 10:57:06.248 코어 1 최종 잔액 10000.00핍

EE 0 10:57:06.248 코어 1 EURUSD,M1: 39553틱, 10068바가 생성되었습니다. 환경이 0:00:00.031에 동기화되었습니다. 0:00:00.247에 테스트를 통과했습니다(0:00:00.016을 사전 처리하는 틱 포함).

0 10:57:06.248 코어 1 EURUSD,M1: 로그인부터 테스트 중지까지의 총 시간 0:00:00.278(이력 데이터 동기화를 위한 0:00:00.031 포함)

NQ 0 10:57:06.248 코어 1 36Mb의 히스토리 데이터, 64Mb의 틱 데이터를 포함하여 272Mb 메모리 사용

0 10:57:06.248 코어 1 "C:\Users\a1960\AppData\Roaming\MetaQuotes\Tester\36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" 로그 파일 작성

OS 0 10:57:06.260 코어 1 연결 닫힘


 
Denis Diakonov :

말해주세요!

새 틱이 도착할 때 서버 시간이 업데이트되지 않는 이유는 무엇입니까?

어드바이저를 시작하는 순간 모든 것이 제대로 작동하지만 시간이 흐르고 현재 분의 새 값이 변수에 입력되지 않습니다.

저것들. 내 조언자는 변수 int M = TimeMinute(TimeCurrent())에 의해 수신된 숫자에 따라 작동합니다.

실제로 코드 라인은 참고서에서 가져온 것이며 작동하지도 않습니다.

예를 들어 12분 만에 실행 -  현재 시간   서버에서 반환된 시간은 변수의 시간에 해당하며 시계에서는 이미 15-20분이지만 변수는 12로 유지됩니다.

코드는 완전히 더 낫습니다. 또는 오히려 함수를 생성한 위치와 함수(OnInit, OnTick, OnTime)에서 분 값을 얻고 인쇄 함수를 호출하는 위치입니다. OnInit에 있거나 터미널 기능의 필드 외부에 있으면 그렇게 되어야 합니다. OnTik에 있는 경우 각 틱마다 새 분으로 값을 인쇄하고 업데이트합니다.

 

서버 시간 및 변수 값의 예시

발레리 야스트렘스키 :

코드는 완전히 더 낫습니다. 또는 오히려 함수를 생성한 위치와 함수(OnInit, OnTick, OnTime)에서 분 값을 얻고 인쇄 함수를 호출하는 위치입니다. OnInit에 있거나 터미널 기능의 필드 외부에 있으면 그렇게 되어야 합니다. OnTick에 있으면 각 틱에 인쇄하고 새 분으로 값을 업데이트합니다.

 int M = TimeMinute( TimeCurrent ());
bool TimeServer()                                                  
{  
   Print (M, " - Tекущее время сервера" );
   if ((M > 55 || M == 55 ) && (M < 59 || M == 59 ))
   {
   return ( true );
   }
   else
   {
   return ( false );
   }
}

글쎄, 여기에 코드가 완전히 있습니다. 그게 전부입니다. void OnTick() 함수에서는 실행될 첫 번째 줄로 맨 처음에 시작됩니다.

차트/삭제 필드/ 에 대한 재컴파일 또는 첨부의 순간에만 발생합니다. 나머지 시간 동안 변수 M은 EA가 처음 실행되었을 때 받은 분 값을 유지합니다.

 
Denis Diakonov :

글쎄, 여기에 코드가 완전히 있습니다. 그게 전부입니다. void OnTick() 함수에서는 실행될 첫 번째 줄로 맨 처음에 시작됩니다.

차트/삭제 필드/ 에 대한 재컴파일 또는 첨부의 순간에만 발생합니다. 나머지 시간 동안 변수 M은 EA가 처음 실행되었을 때 받은 분 값을 유지합니다.

 //--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick () // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return ;                             // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute( TimeCurrent ());
m2=M;
if (m1!=M)
   Alert (M, " - Tекущее время сервера" );
   Print (M, " - Tекущее время сервера" );
     if (( M >= 55 ) && (M <= 59 ))
   {
   return ( true );
   }
   else
   {
   return ( false );
   }
}
 
Valeriy Yastremskiy :

이해했습니다 감사합니다!

할 필요가 있었다

 int M = TimeMinute( TimeCurrent ());

함수 본문에 넣고 그 앞에 값을 할당하지 않고 M 값을 할당합니다.

 
Denis Diakonov :

이해했습니다 감사합니다!

할 필요가 있었다

함수 본문에 넣고 그 앞에 값을 할당하지 않고 M 값을 할당합니다.

다양한 방법으로 가능합니다. 전역 및 지역 변수와 해당 가시성을 읽습니다.

 

안녕하세요. 각도에서 추세선의 각도를 얻으려고합니다. 코드는 다음과 같습니다.

 void DrawLine( string name,
               datetime time1,
               double price1,
               datetime time2,
               double price2,
               double &angle)
  {
   CChartObjectTrendByAngle *line= new CChartObjectTrendByAngle();
   if (!line.Create( ChartID (),name, 0 ,time1,price1,time2,price2))
     {
       Print ( __FUNCTION__ + ": object line create failed. Last error: " , GetLastError ());
       delete line;
       return ;
     }
   
   line.Color(InpColorZoneUp);
   line.Background( false );
   line.RayLeft( false );
   line.RayRight( false );
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

angle은 항상 0입니다. 표준 라이브러리 메서드를 사용할지 내장 함수를 사용할지 여부. 이 경우 선이 그려집니다. 뭐가 문제 야? 각도를 얻는 방법?

 
leonerd :

안녕하세요. 각도에서 추세선의 각도를 얻으려고합니다. 코드는 다음과 같습니다.

angle은 항상 0입니다. 표준 라이브러리 메서드를 사용할지 내장 함수를 사용할지 여부. 이 경우 선이 그려집니다. 뭐가 문제 야? 각도를 얻는 방법?

https://www.mql5.com/ru/forum/103591

물론입니다. 하지만 각도를 어떻게 계산합니까?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd :

https://www.mql5.com/ru/forum/103591

물론입니다. 하지만 각도를 어떻게 계산합니까?

글쎄, 당신은 코미디언입니다.

내가 여기서 누구를 십자가에 못 박고 있습니까?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

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

니콜라이 셈코 , 2020.10.26 00:34

왜 속도를 두려워합니까? 이것은 유형 캐스팅에 대한 규칙일 뿐입니다.
각도 감지 기능의 변형:

 struct PointPriceTime
  {
   double             price;
   datetime           time;
                     PointPriceTime( double p, datetime t) { price=p; time=t; };
   void               Set( double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price= 0.0 ; time= 0 ; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[ 9 ]= { PERIOD_M1 , PERIOD_M5 , PERIOD_M15 , PERIOD_M30 , PERIOD_H1 , PERIOD_H4 , PERIOD_D1 , PERIOD_W1 , PERIOD_MN1 };
   int i= 0 ;
   while (i< 9 && SeriesInfoInteger ( _Symbol ,tf[i], SERIES_FIRSTDATE )>p1.time)
      i++;
   if (i== 9 )
     {
       Print ( "Время левой границы вне диапазона исторических данных" );
       return DBL_MAX ;
     }
   int bar1 = iBarShift ( _Symbol ,tf[i],p1.time);
   int bar2 = iBarShift ( _Symbol ,tf[i],p2.time);
   if (bar1==bar2)
       return 0.0 ;
   return atan ((p2.price-p1.price)/((bar1-bar2)* PeriodSeconds (tf[i])* _Point / 60 ))* 180 / M_PI ;
  }

MT5 이후에는 MT4로 작업하는 느낌이 끔찍합니다. 역사에 대한 접근은 어떻게든 거세되었습니다. 나는 진드기에 대해서도 침묵을 지킨다.




 

표시기에서 그러한 글꼴을 선택할 수 있는지 알려주실 수 있습니까?