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

 
그래서 스크립트는
 void OnStart ()
  {
   int Target= 6 ;       //Количество тайм-фреймов
   int Counter_UP= 0 ;   //Счетчик нахождения цены над МА
   int Counter_DOWN= 0 ;
   int MA = 200 ;       //Период МА
   double bufer_MA[];   //Буфер для хендла
   ENUM_TIMEFRAMES frame1[ 10 ];   //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[ 1 ]= 1 ;
   frame1[ 2 ]= 5 ;
   frame1[ 3 ]= 15 ;
   frame1[ 4 ]= 30 ;
   frame1[ 5 ]= 16385 ;
   frame1[ 6 ]= 16388 ;
   frame1[ 7 ]= 16408 ;
   frame1[ 8 ]= 32769 ;
   frame1[ 9 ]= 49153 ;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal ( true );   //Колл. символов в маркет вотч
   Alert ( "Колл.Инстр = " ,KollSymbols);
//---
   int MA200;   //Переменная для хендла
   for ( int i= 0 ; i<KollSymbols; i++) //Перебераем все символы из маркет вотч
     {
       string symbol = SymbolName (i, true );   //Выбираем имя символа из маркет вотч
     // Alert("symbol = ",symbol,"i= ",i);
       for ( int I= 1 ; I<=Target; I++)   //Перебераем таймфреймы
        {
         MA200 = iMA (symbol,frame1[I],MA, 0 , MODE_EMA , PRICE_MEDIAN );   //хендл на выбранном тайме
         CopyBuffer (MA200, 0 , TimeCurrent (), 5 ,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

         ArraySetAsSeries (bufer_MA, true );   //Разворачиваем массив как в тайм-серии

         //Alert("Символ - ",symbol,"i= ",i);
         // Alert("Simbol = ",symbol," bufer_MA[1] = ",bufer_MA[1]);
         if ( iClose (symbol,frame1[I], 1 ) > bufer_MA[ 1 ])   //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
           {
             //Alert("iClose= ",iClose(symbol,frame1[I],1), " bufer_MA[1]= ",bufer_MA[1]);
            Counter_UP++;
             if (Counter_UP==Target)
               Alert ( "Инструмент для наблюдения в покупки - " ,symbol);

             ArrayFree (bufer_MA);       //Очистка буфера индикатора
         
           }
         else
           {
             ArrayFree (bufer_MA);       //Очистка буфера индикатора
           }
         IndicatorRelease (MA200); //Удаление хендла
        }
      Counter_UP= 0 ;
      Counter_DOWN= 0 ;
     }
  }
//+------------------------------------------------------------------+

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

작동 규범. 그리고 22개의 instr 목록. 꽤 오랜 시간 동안 프로세스 분 5. 이것은 이상하지만. 그는 대부분의 시간을 배열에 대한 핸들을 작성하는 데 보냅니다. 프로파일링 요약


문제. 목록에서 22개의 기기에 대해 복사가 132번 발생하지만 핸들에서 배열로 5개의 값을 복사하는 데 왜 그렇게 시간이 많이 소요됩니까? 즉, 273개의 악기에 대해 1632번 복사해야 하며 모든 악기에 대한 기록을 하드 컴퓨터에 로드해야 합니다.

 
Fast235 # :

핸들 생성 및 삭제 정보,

작동합니다. 올바른 방법에 관심이 있습니다. 개발자가 말하기를 바랍니다.

여기에서 나는 그것을하고 있습니다. 위의 코드를 보면 질문도 있습니다))

 
Kira27 # :
그래서 스크립트는

작동 규범. 그리고 22개의 instr 목록. 꽤 오랜 시간 동안 프로세스 분 5. 이것은 이상하지만. 그는 대부분의 시간을 배열에 대한 핸들을 작성하는 데 보냅니다. 프로파일링 요약


문제. 목록에서 22개의 기기에 대해 복사가 132번 발생하지만 핸들에서 배열로 5개의 값을 복사하는 데 왜 그렇게 시간이 많이 소요됩니까? 즉, 273개의 악기에 대해 1632번 복사해야 하며 모든 악기에 대한 기록을 하드 컴퓨터에 로드해야 합니다.

당신이 아무것도 망치지 않았다면.

따옴표가 업로드되면 잘 작동하는 것 같습니다. 그러면 속도가 느려지지 않습니다. 첫 번째 실행은 매우 길며 인용문을 다운로드하는 것 같습니다.

 //+------------------------------------------------------------------+
void OnStart ()
  {
   int Target = 6 ;     //Количество тайм-фреймов
   int Counter_UP = 0 ; //Счетчик нахождения цены над МА
   int Counter_DOWN = 0 ;
   int MA = 200 ;       //Период МА
   double bufer_MA[];   //Буфер для хендла
   int MA200[][ 9 ];   //Переменная для хендла
   string symbol[];

   ENUM_TIMEFRAMES frame1[ 9 ];   //Битная маска тайм-фреймов
//___________________int битная маска ENUM  Массив таймфреймов__________________________________________
   frame1[ 0 ] = 1 ;
   frame1[ 1 ] = 5 ;
   frame1[ 2 ] = 15 ;
   frame1[ 3 ] = 30 ;
   frame1[ 4 ] = 16385 ;
   frame1[ 5 ] = 16388 ;
   frame1[ 6 ] = 16408 ;
   frame1[ 7 ] = 32769 ;
   frame1[ 8 ] = 49153 ;
//____________________________________________________________________________________________________________

   int KollSymbols = SymbolsTotal ( true );   //Колл. символов в маркет вотч
   Print ( "Колл.Инстр = " , KollSymbols);
   int res = 0 ;
   for ( int i = 0 ; i < KollSymbols; i++)
     {
       for ( int I = 0 ; I < 9 ; I++) //Перебераем таймфреймы
        {
         ArrayResize (MA200, i + 1 );
         ArrayResize (symbol, i + 1 );
         symbol[i] = SymbolName (i, true ); //Выбираем имя символа из маркет вотч
         MA200[i][I] = iMA (symbol[i], frame1[I], MA, 0 , MODE_EMA , PRICE_MEDIAN ); //хендл на выбранном тайме
         if (MA200[i][I] == INVALID_HANDLE )
             PrintFormat ( "Инвалид хэндл, символ %s, тайм %d" , symbol[i], frame1[I]);
         res++;
        }
     }
   Print ( "Создано хэндлов = " + ( string )res);

//---
   for ( int i = 0 ; i < KollSymbols; i++)
     {
       for ( int I = 0 ; I < 9 ; I++) //Перебераем таймфреймы
        {
         int size = CopyBuffer (MA200[i][I], 0 , 1 , 1 , bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма
         PrintFormat ( "Скопировано %d, символ %s, тайм %d" , size, symbol[i], frame1[I]);
         if (size > 0 )
             if ( iClose (symbol[i], frame1[I], 1 ) > bufer_MA[ 0 ]) //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре
              {
               Counter_UP++;
              }
        }
     }
   Print ( "Counter_UP = " + ( string )Counter_UP);
  }
//+------------------------------------------------------------------+
 
Kira27 # :

스크립트의 의미는 1분에서 4시간 사이의 시간대에 시장 시계에서 각 상품을 분류하는 것입니다.

이렇게 하면 배열을 만들고 과거 데이터를 저장하고 현재 데이터를 업데이트합니다. 이것은 무거운 루프와 CopyBuffer를 피할 것입니다. 모든 것이 날아갈 것입니다.

 
Aleksandr Slavskii # :

당신이 아무것도 망치지 않았다면.

따옴표가 업로드되면 속도가 느려지지 않고 잘 작동하는 것 같습니다. 첫 번째 실행은 매우 길며 인용문을 다운로드하는 것 같습니다.

응답과 성능 버전에 감사드립니다. 실험해 보겠습니다.) 왜 프로그램이 끝나기 전에 핸들을 삭제하지 않는지 이해가 되지 않습니까? 또는 프로그램 종료 시 자동으로 삭제됩니다. 요원은 작업 관리자의 판단에 따라 석방되지는 않지만.

 
Aleksei Stepanenko # :

이렇게 하면 배열을 만들고 과거 데이터를 저장하고 현재 데이터를 업데이트합니다. 이것은 무거운 루프와 CopyBuffer를 피할 것입니다. 모든 것이 날아갈 것입니다.

고맙습니다! 나도 생각해볼게)

 
Kira27 # :

응답과 성능 버전에 감사드립니다. 실험해 보겠습니다.) 왜 프로그램이 끝나기 전에 핸들을 삭제하지 않는지 이해가 되지 않습니까? 또는 프로그램 종료 시 자동으로 삭제됩니다. 요원은 작업 관리자의 판단에 따라 석방되지는 않지만.

스크립트가 완료되면 일정 시간이 지나면 표시기 핸들이 삭제된다는 글을 어디선가 본 것 같습니다. 그러나 그것은 정확하지 않습니다.

 
좋은! 후 방법을 알려주세요   MQL5에서 Expert Advisor 를 테스트할 때 화살표 위로 마우스를 가져가면 팝업 창에 통계가 표시됩니까?
 

여보세요

터미널에 선형 회귀 도구가 있습니다.

그래픽 개체로 동일한 채널을 그리는 스크립트가 있습니다.

그러나 중심선만 올바르게 그려지고 편차선은 중심에서 잘못된 거리에 그려집니다.

터미널과 같도록 편차를 계산하는 올바른 공식을 아는 사람이 있는지 알려주십시오.

또는 누군가가 해결책을 가지고 있습니까

감사합니다

 

안녕하세요!

AMarkets 브로커로 테스트할 때 암호화폐 에서 OrderSend 기능 이 작동하지 않는 이유를 알려주세요. 규정에 따르면 지하실에서 거래 고문에 대한 금지 사항을 찾지 못했습니다. 아니면 코드에 오류가 있습니까? GetLastError에서 오류 4756이 발생합니다.

 #property copyright "qwerty"
#property link        "qwerty@list.ru"
#property version    "1.00"
//-----------------
//-----------------
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
//-----------------
//-----------------
CPositionInfo  aPosition;
CTrade         aTrade;
CSymbolInfo    aSymbol;
CAccountInfo   aAccount;
//-----------------
//-----------------

int       Slippage      = 3000 ;
//---
//---------------------------------
//------пробные переменные
double LotsCrypto = 0 ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if (!aSymbol.Name( Symbol ()))
       return ( INIT_FAILED );
   RefreshRates();
//---устанавливаем допустимое проскальзывание
   aTrade.SetDeviationInPoints(Slippage);
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
  RefreshRates();
   LotsCrypto = 0.1 ;
   if (OpenSellPosition(aSymbol.Name(), LotsCrypto, NULL , Slippage, ORDER_FILLING_RETURN ))
       Print ( "Ура" );  
   Comment ( "Symbol.Name = " + string (aSymbol.Name()) + "\n" +
           "Ask = " +   string (aSymbol.Ask()) + "\n" +
           "GetLastError = " +   string ( GetLastError ()) + "\n" +
           "LotsCrypto = " +   string (LotsCrypto));

}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//+ Обновление котировок                                             +
//+------------------------------------------------------------------+
bool RefreshRates()
  {
   if (!aSymbol.RefreshRates())
     {
       Print ( "Не удалось обновить котировки валютной пары!" );
       return ( false );
     }
   if (aSymbol.Ask() == 0 || aSymbol.Bid() == 0 )
       return ( false );
   return ( true );
  }

//+------------------------------------------------------------------+
bool OpenSellPosition( string symbol, double volume, string comment= "" , ulong deviation= 1000 , ENUM_ORDER_TYPE_FILLING filling= ORDER_FILLING_FOK )
  {
   MqlTradeRequest Request;
   MqlTradeResult Results;
   ZeroMemory (Request);
   ZeroMemory (Results);
   Request.price= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
   Request.action= TRADE_ACTION_DEAL ;
   Request.type= ORDER_TYPE_SELL ;
   Request.symbol=symbol;
   Request.volume=volume;
   Request.deviation=deviation;
   Request.comment=comment;
   Request.type_filling=filling;
   bool res= false ;
   res= OrderSend (Request,Results);
   if (res)
     {
       if (Results.deal> 0 )
         return ( true );
       else
         return ( false );
     }
   return ( false );
  }
//+------------------------------------------------------------------+
사유: