초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 74

 
안녕하세요! 2개의 기호(예: EURUSD 및 GBPUSD)를 사용 하는 표시기를 만들 려고 했지만 그리지 않습니다(오류 4806 제공)... OnInit 함수에서 각 기호의 표시기 핸들(예: iRSI)을 얻습니다. OnCalculate에서 기능 지표 데이터를 버퍼에 복사하고 추가 작업에 사용합니다... 그래서 하나의 기호(지표를 첨부한 차트의 기호와 일치하는 기호에 대한)에 대한 지표 데이터는 정상적으로 수신되지만 두 번째 기호에 대한 표시기 데이터가 수신되지 않습니다... 즉, 지표가 연결된 차트의 기호와 일치하는 기호에 대한 데이터만 가져옵니다. 제가 뭘 잘못하고 있는 건가요?
 
FinEngineer :
안녕하세요! 2개의 기호(예: EURUSD 및 GBPUSD)를 사용 하는 표시기를 만들 려고 했지만 그리지 않습니다(오류 4806 제공)... OnInit 함수에서 각 기호의 표시기 핸들(예: iRSI)을 얻습니다. OnCalculate에서 기능 지표 데이터를 버퍼에 복사하고 추가 작업에 사용합니다... 그래서 하나의 기호(지표를 첨부한 차트의 기호와 일치하는 기호에 대한)에 대한 지표 데이터는 정상적으로 수신되지만 두 번째 기호에 대한 표시기 데이터가 수신되지 않습니다... 즉, 지표가 연결된 차트의 기호와 일치하는 기호에 대한 데이터만 가져옵니다. 제가 뭘 잘못하고 있는 건가요?
따라서 문제를 일으킨 코드 부분을 보여주십시오.
 

아무 것도 작동하지 않기 때문에 전체 코드를 게시하는 중입니다. 모든 것이 mql4에서 훨씬 간단했고 아마도 습관 때문일 수도 있습니다... 이러한 핸들과 보조 버퍼는 마음을 아프게 합니다.

의미가 명확하다고 생각합니다(상관 악기 2개의 rsi 차이). 도와주세요... 오류를 지적해 주시겠습니까?

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#속성 링크 "http://www.mql5.com"
#속성 버전 "1.00"

//---- 표시기 그리기 속성
#속성 표시기_버퍼 3
#property indicator_label1 "Pair_delta_RSI"
#속성 표시기_유형1 DRAW_LINE
#property indicator_color1 빨간색
#속성 표시기_스타일1 STYLE_SOLID
#속성 표시기_너비1 1
//입력 매개변수
입력 문자열 Symbol1_Name = "EURUSD";
입력 문자열 Symbol2_Name = "GBPUSD";
입력 intPeriodRSI=7;
입력 부울 반전=거짓;
ENUM_APPLIED_PRICE 입력 InpAppliedPrice=PRICE_CLOSE;

이중 DeltaRSI_Buffer[];
이중 RSI1_Buffer[];
이중 RSI2_Buffer[];

int RSI1_핸들;
intRSI2_핸들;

int OnInit()
{
SetIndexBuffer(0,DeltaRSI_Buffer,INDICATOR_DATA);
SetIndexBuffer(1,RSI1_Buffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(2,RSI2_Buffer,INDICATOR_CALCULATIONS);

RSI1_Handle=iRSI(Symbol1_Name,0,PeriodRSI,PRICE_CLOSE); // 표시기 핸들 가져오기
RSI2_Handle=iRSI(Symbol2_Name,0,PeriodRSI,PRICE_CLOSE);
리턴(0);
}

int OnCalculate(const int rate_total, const int prev_calculated,
const 날짜/시간 및 시간[],
const 이중 및 열기[],
const 더블 & 하이[],
const 이중 및 낮음[],
const 이중 닫기[],
const long &TickVolume[],
상수 긴 볼륨[],
상수 정수(&Spread)[])
{
int 계산 = BarsCalculated(RSI1_Handle);
if(계산된<rate_total)
{
Print("RSI1_Handle의 모든 데이터가 계산되지는 않습니다(",calculated,"bars). Error",GetLastError());
리턴(0);
}
계산됨=BarsCalculated(RSI2_Handle);
if(계산된<rate_total)
{
Print("RSI2_Handle의 모든 데이터가 계산되지는 않습니다(",calculated,"bars). Error",GetLastError());
리턴(0);
}
//--- 모든 데이터를 복사할 수는 없습니다.
int to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
또 다른
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//RSI1 버퍼 가져오기
if(CopyBuffer(RSI1_Handle,0,0,to_copy,RSI1_Buffer)<=0)
{
Print("RSI1 가져오기 실패! 오류",GetLastError());
리턴(0);
}
//RSI2 버퍼 가져오기
if(CopyBuffer(RSI2_Handle,0,0,to_copy,RSI2_Buffer)<=0)
{
Print("RSI2 가져오기 실패! 오류",GetLastError());
리턴(0);
}
//---
정수 제한;
if(이전_계산==0)
제한=0;
그렇지 않으면 제한=prev_calculated-1;
// 표시기 델타 rsi를 계산합니다.
for(int i=limit; i<rate_total; i++)
DeltaRSI_Buffer[i]=RSI1_Buffer[i]-RSI2_Buffer[i];
반환(요금 합계);
}

Automated Trading and Strategy Testing
Automated Trading and Strategy Testing
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 

실수 #1

SRC 키 사용 거부

 

예를 들어 표준 사용자 정의 MACD 표시기를 사용하여 해당 행을 변경하면 유사한 오류가 발생합니다.

ExtFastMaHandle=iMA(NULL,0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

ExtFastMaHandle=iMA("EURUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);

MACD가 EURUSD 차트에 첨부되어 있으면 모든 것이 그려지고 다른 차트에 첨부되면 오류 4806이 나타납니다... 표시기에서 원하는 만큼 많은 기호를 사용할 수 있게 하는 방법은 무엇입니까?

이전에 배치한 지표가 작동하도록 하는 방법을 알려주시면 대단히 감사하겠습니다.

 
mario065 :

Lester : 여기에 템플릿을 넣고 내부를 먹고 수정하고 크롤링하는 방법을 보여주었습니다.

https://www.mql5.com/ru/forum/6343/page73

원하지 않으면 변수를 올바르게 고려해야합니다.

다양한 성공으로 나는 Schablon 파일의 본질을 파악하고 약간의 내 조건과 만세를 이끌었습니다. 중지 및 이익이 설정되었습니다. 그러나 저에게는 중요한 막다른 골목이 있습니다. 그들은 진드기가 아닌 다음 양초에 설정되어 있습니다. 나는 고문의 일부를 가져옵니다.

   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
  
   if ( PositionSelect ( _Symbol ))
  {
     Open = PositionGetDouble ( POSITION_PRICE_OPEN );
     SL   = PositionGetDouble ( POSITION_SL );
     T_P  = PositionGetDouble ( POSITION_TP );
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
     buy_trail = NormalizeDouble (Bid - Open, Digits ());
     sel_trail = NormalizeDouble (Open - Ask, Digits ()); 
    
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
    {
     if (! PositionGetDouble ( POSITION_SL ))
      {
      PositionModify( _Symbol , NormalizeDouble ((Open-STR-TR), Digits ()), NormalizeDouble ((Open+TP), Digits ()));
      }
 
Lester :

다양한 성공으로 나는 Schablon 파일의 본질을 파악하고 약간의 내 조건과 만세를 이끌었습니다. 중지 및 이익이 설정되었습니다. 그러나 저에게는 중요한 막다른 골목이 있습니다. 그들은 진드기가 아닌 다음 양초에 설정되어 있습니다. 코드의 일부를 게시하고 있습니다.

 input double TP            = 0.003 ;
input double STR           = 0.0012 ;
input double TR            = 0.0002 ;
//=============================================== 
//Един вид извикване на модификация на отворената позиция
   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
Ну ладно-обяснения:

   if ( PositionSelect ( _Symbol )){ //Ест ли позиция по символа
     Open = PositionGetDouble ( POSITION_PRICE_OPEN ); //цена опен для поза
     SL   = PositionGetDouble ( POSITION_SL ); //цена стоп для поза
     T_P  = PositionGetDouble ( POSITION_TP ); //цена тейк для поза
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID ); //цена бид
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK ); //цена аск
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL ); //стоп ниво,если ест такое-оно в пункты
     buy_trail = NormalizeDouble (Bid - Open, Digits ()); //вычисляем разстояние от цена бид и цена опен позиции-ето для бай
     sel_trail = NormalizeDouble (Open - Ask, Digits ()); //вычисляем разстояние от цена опен позиции и цена аск-ето для сел
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ) //если ест бай поза
      {
       if (buy_trail > STR) //если разстояние болше указаное
       {
         if ( NormalizeDouble ((Bid - STR), Digits ()) >= Open && Open > SL)
//если цена бид минус указаное разстояние болше щем цена опен и цена опен болше цена стоп-вызиваем модификация
//сама модификация-для стоп будет цена опен,цена тейк не меняем.
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Bid - TR), Digits ()) > SL && Open <= SL)
//если цена бид минус указаное разстояние TR = 0.0002 болше уже от новый стоп(который поменяли уже) и цена опен менше новый стоп 
//вызиваем модификация
//сама модификация - для стоп будет прошлый стоп минус стоп ниво* _Point(что б стали пипси) плюс указаное TR,цена тейк не меняем.
//Т.е. будем двигат стоп через каждые 2 пипса  
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL - L_S * _Point ) + TR), Digits ()),T_P);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
       if (sel_trail > STR)
       { 
         if ( NormalizeDouble ((Ask + STR), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Ask + TR), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL +L_S * _Point )- TR), Digits ()),T_P);
           }
        }
      }
     } 
//===============================================

어떤 행동이 일어난 그러한 조건을 쓰는 것이 항상 필요하지만 모든 것이 생각되고 논리가 있습니다.

도움이 필요하면 print(Print(" ", ); ) 를 작성하고 무엇을 반환하는지 확인하십시오 - 작성한 것의 결과.

 
mario065 :

모든 설명이 명확하고 작동합니다. 그러나 이것은 "손익분기점" 및 "후행"에 대한 수정입니다. 그리고 주문을 연 후 Stoplimit 및 TakeProfit 설정을 위한 수정 사항을 작성해야 합니다.

1. 주문 열기

--------

2. 정지 제한 수정 (아직은 아닙니다!)

  if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
    {
     if (! PositionGetDouble ( POSITION_SL ))
      {
      PositionModify( _Symbol , NormalizeDouble ((Open-STR-TR), Digits ()), NormalizeDouble ((Open+TP), Digits ()));
      }

------

3. 손익분기점 수정

4. 후행 수정

5.주문 마감


포인트 2에 따르면 수정이 이루어지지만 다음 바의 시작과 함께 시작되지만 주문이 시작된 후 틱에 연결되어야 합니다.

 

Eats를 열려면 다음과 같은 함수가 작성됩니다.

Сама функция(символ,обем,проскалзивание,стоп,тейк,магик)
С вызова функции можно все сразу поставит.
bool BuyPositionOpen( const string symbol, double volume, ulong deviation, double StopLoss, double Takeprofit, int Magic)     
     if (Какое то условие)
      {
       BuyPositionOpen( _Symbol ,Lot, 0 , NormalizeDouble (Ask - 0.003 , _Digits ), NormalizeDouble (Ask + 0.003 , _Digits ),MagicNumber);
      }
     if (Какое то условие)
      {
       SellPositionOpen( _Symbol ,Lot, 0 , NormalizeDouble (Bid + 0.003 , _Digits ), NormalizeDouble (Bid - 0.003 , _Digits ),MagicNumber);
      }
Функция для закрития:
Сама функция(символ,проскалзивание,магик)
bool BuyPositionClose( const string symbol, ulong deviation, int Magic)
// Логика за затваряне на дългите
       if (Какое то условие){
         BuyPositionClose( _Symbol , 0 ,MagicNumber);}                        
// Логика за затваряне на късите
       if (Какое то условие){
         SellPositionClose( _Symbol , 0 ,MagicNumber);} 

Если не хочете сразу ставит стоп и тейк,тогда:
//=============================================== 
//Един вид извикване на модификация на отворената позиция
   double buy_trail = 0 ;
   double sel_trail = 0 ;
   double SL,T_P,Open;
   ulong L_S;
   if ( PositionSelect ( _Symbol )){
     Open = PositionGetDouble ( POSITION_PRICE_OPEN );
     SL   = PositionGetDouble ( POSITION_SL );
     T_P  = PositionGetDouble ( POSITION_TP );
     Bid  = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
     Ask  = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
     L_S  = SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_STOPS_LEVEL );
     buy_trail = NormalizeDouble (Bid - Open, Digits ());
     sel_trail = NormalizeDouble (Open - Ask, Digits ());
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY )
      {
if (SL = 0 && T_P = 0 ) //если стоп и тейк равни нулю-вызиваете модофикация и там акуратно ложите нужная вам цена
{
  ModifyPosition( _Symbol , NormalizeDouble ((Open - 0.003 ), Digits ()), NormalizeDouble ((Open + 0.003 ), Digits ()));
}
//Далше вам понятно:
       if (buy_trail > STR)
       {
         if ( NormalizeDouble ((Bid - STR), Digits ()) >= Open && Open > SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Bid - TR), Digits ()) > SL && Open <= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL - L_S * _Point ) + TR), Digits ()),T_P);
           }
        }
      }
     if ( PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_SELL )
      {
       if (sel_trail > STR)
       { 
         if ( NormalizeDouble ((Ask + STR), Digits ()) <= Open && Open < SL)
          {
           ModifyPosition( _Symbol ,Open,T_P);
          }
           if ( NormalizeDouble ((Ask + TR), Digits ()) < SL && Open >= SL)
           {
            ModifyPosition( _Symbol , NormalizeDouble (((SL +L_S * _Point )- TR), Digits ()),T_P);
           }
        }
      }
     } 
//=============================================== 
 
이 스레드에 MQL5 개발자가 있습니다!??? 내가 잘못된 스레드에서 질문을 하고 있는 것은 아닐까? 개발자에게 질문하는 방법을 알려주세요 ??? 질문은 위에 언급되어 있습니다. 숙련된 프로그래머에게는 기본 사항입니다...
사유: