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

 

안녕하세요.

도와주세요. 사용자 정의 함수를 작성할 때 테스터는 오류 3을 표시하고 주문을 열지 않습니다. 오류를 지정합니다.

 ticket= OrderSend ( Symbol (),OP_SELLSTOP,Lots,Prices_install(), 3 , 0 , 0 , NULL ,MAGICNUMBER, 0 , clrGreen );
               if (ticket> 0 ) //проверка отрытия позиции
                 {
                   if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
                     Print ( "SELL ордер открыт:" ,OrderOpenPrice());
                 }
               else
                   Print ( "Ошибка открытия ордера SELL:" , GetLastError ());
              }
             return ;
           }
        }
 //+---------------------------------------------------------------------------+
       //|                     Условия модификации ордеров                           |
       //+---------------------------------------------------------------------------+

       if (ticket> 0 )
        {
         if ( OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES))
           {
             //--- длинная позиция открыта
             switch (OrderType())
              {
               case OP_BUYSTOP:
                   if ( NormalizeDouble (OrderOpenPrice()-Prices_install(), Digits )> 0 && NormalizeDouble (Prices_install()-Bid, Digits )> 0 )
                    {
                     if (OrderModify(ticket,Prices_install(), 0 , 0 , 0 , clrBlue ))
                         Print ( "Цена Price_BUY ордера успешно модифицирована." );
                     else
                         Print ( "Ошибка модификации ордера BUYStop. Код ошибки=" , GetLastError ());
                    }
                   else
                     Print ( "Цена модификации выше цены ордера" );
                   break ;
               case OP_SELLSTOP:
                   if ( NormalizeDouble (Prices_install()-OrderOpenPrice(), Digits )> 0 && NormalizeDouble (Ask-Prices_install(), Digits )> 0 )
                    {
                     if (OrderModify(ticket,Prices_install(), 0 , 0 , 0 , clrGreen ))
                         Print ( "Цена Price_SELL ордера успешно модифицирована." );
                     else
                         Print ( "Ошибка модификации ордера SELLStop. Код ошибки=" , GetLastError ());
                    }
                   else
                     Print ( "Цена модификации выше цены ордера" );
                   break ;
               case OP_BUY:
                   if ( NormalizeDouble (StopLosse_install()-OrderStopLoss(), Digits )> 0 && NormalizeDouble (Ask-StopLosse_install(), Digits )> 0 )
                    {
                     if (OrderModify(ticket,OrderOpenPrice(),StopLosse_install(), 0 , 0 , clrBlue ))
                         Print ( "Цена Price_BUY ордера успешно модифицирована." );
                     else
                         Print ( "Ошибка модификации ордера BUY. Код ошибки=" , GetLastError ());
                    }
                   else
                     Print ( "Цена модификации выше цены ордера" );
                   break ;
               case OP_SELL:
                   if ( NormalizeDouble (OrderStopLoss()-StopLosse_install(), Digits )> 0 && NormalizeDouble (StopLosse_install()-Bid, Digits )> 0 )
                    {
                     if (OrderModify(ticket,OrderOpenPrice(),StopLosse_install(), 0 , 0 , clrGreen ))
                         Print ( "Цена Price_SELL ордера успешно модифицирована." );
                     else
                         Print ( "Ошибка модификации ордера SELL. Код ошибки=" , GetLastError ());
                    }
                   else
                     Print ( "Цена модификации выше цены ордера" );
                   break ;
              }
           }
        }
       Sleep ( 5 );
     }
   return ;
  }
//+------------------------------------------------------------------+
double StopLosse_install()
  {
   double StopLoss= iSAR ( NULL ,PERIODs_short_term,Step,Maximum, 1 );
   double StopLoss_install;
   int StopLevel=( int )MarketInfo( Symbol (),MODE_STOPLEVEL); // Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
   int FreezeLevel=( int )MarketInfo( Symbol (),MODE_FREEZELEVEL); //Уровень заморозки ордеров в пунктах
   switch (OrderType())
     {
       case 0 :
         if (Bid-StopLoss>FreezeLevel)
           {
             if (Bid-StopLoss>=StopLevel)
               StopLoss_install= NormalizeDouble (StopLoss, Digits );
             if (Bid-StopLoss<StopLevel)
               StopLoss_install= NormalizeDouble (StopLoss-StopLevel*MarketInfo( Symbol (),MODE_DIGITS), Digits );
           }
         else
             Print ( "Цена открытия ордера находится в дистанции заморозки:" , GetLastError ());
         break ;
       case 1 :
         if (StopLoss-Ask>FreezeLevel)
           {
             if (StopLoss-Ask>=StopLevel)
               StopLoss_install= NormalizeDouble (StopLoss, Digits );
             if (StopLoss-Ask<StopLevel)
               StopLoss_install= NormalizeDouble (StopLoss+StopLevel*MarketInfo( Symbol (),MODE_DIGITS), Digits );
           }
         else
             Print ( "Цена открытия ордера находится в дистанции заморозки:" , GetLastError ());
         break ;
     }
     return (StopLoss_install);
  }
//+------------------------------------------------------------------+
double Prices_install()
  {
   double Price= iSAR ( NULL ,PERIODs_short_term,Step,Maximum, 1 );
   double Price_install;
   int StopLevel=( int )MarketInfo( Symbol (),MODE_STOPLEVEL); // Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
   int FreezeLevel=( int )MarketInfo( Symbol (),MODE_FREEZELEVEL); //Уровень заморозки ордеров в пунктах
   switch (OrderType())
     {
       case 4 :
         if (Price-Ask>FreezeLevel)
           {
             if (Price - Ask>=StopLevel)
               Price_install= NormalizeDouble (Price, Digits );
             if (Price - Ask<StopLevel)
               Price_install= NormalizeDouble (Price+StopLevel*MarketInfo( Symbol (),MODE_DIGITS), Digits );
           }
         else
             Print ( "Цена открытия ордера находится в дистанции заморозки:" , GetLastError ());
         break ;
       case 5 :
         if (Bid-Price>FreezeLevel)
           {
             if (Bid-Price>=StopLevel)
               Price_install= NormalizeDouble (Price, Digits );
             if (Bid-Price<StopLevel)
               Price_install= NormalizeDouble (Price+StopLevel*MarketInfo( Symbol (),MODE_DIGITS), Digits );
           }
         else
             Print ( "Цена открытия ордера находится в дистанции заморозки:" , GetLastError ());
         break ;
     }
     return (Price_install);
  }
//+------------------------------------------------------------------+
 
Ivan Butko :

하나의 Expert Advisor에서 시간 간격으로 지정된 각 통화 쌍에 대해 하나씩 거래를 시작하면 이상합니다. 그리고 다른 통화쌍(symbol(0))으로 5개의 다른 차트에 베팅할 때 자동 거래를 클릭하면 5개의 거래가 모두 동시에 즉시 열립니다.

무엇이 가능하고 어떻게 고칠 수 있는지 알려주실 수 있습니까? 모든 것이 하나의 어드바이저와 하나 의 차트에 있도록(차트의 버튼 이 원래 버전에서와 같이 여러 어드바이저와 "자동 거래"를 활성화할 때처럼 빠르게 모든 쌍을 열 수 있도록)

여기에 일반적으로 문제가 무엇입니까 .... 우리는 터미널, IMHO를 걸기 위해 가능한 모든 것을하고 있습니다 .... 잘못된 논리를 작성하는 것을 좋아하지 않으므로 원하는대로했습니다. 고문을 던졌습니다. 차트에서 버튼을 누르면 무한 루프에서 주문을 열려고 시도합니다.

 #property copyright "IgorM"
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
#property strict
input string    sym1 = "EURUSD" ;
input double    lot1 = 0.01 ;
input string    sym2 = "GBPUSD" ;
input double    lot2 = 0.01 ;
input string    sym3 = "USDCAD" ;
input double    lot3 = 0.01 ;
input string    sym4 = "USDJPY" ;
input double    lot4 = 0.01 ;
input string    sym5 = "AUDUSD" ;
input double    lot5 = 0.01 ;
#include <Controls\Button.mqh>
CButton ButtonSend;

string sym[ 5 ];
double lot[ 5 ];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit ()
  {
   sym[ 0 ] = sym1;
   sym[ 1 ] = sym2;
   sym[ 2 ] = sym3;
   sym[ 3 ] = sym4;
   sym[ 4 ] = sym5;
   lot[ 0 ] = lot1;
   lot[ 1 ] = lot2;
   lot[ 2 ] = lot3;
   lot[ 3 ] = lot4;
   lot[ 4 ] = lot5;
   ButtonSend.Create( 0 , "ButtonSend" + _Symbol , 0 , 10 , 50 , 100 , 90 );
   ButtonSend.Color( clrRed );
   ButtonSend.Text( "Kill Forex!" );
   OnTick ();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   static int ticket[ 5 ] = {- 1 , - 1 , - 1 , - 1 , - 1 };
   if (ticket[ 0 ] > 0 && ticket[ 1 ] > 0 && ticket[ 2 ] > 0 && ticket[ 3 ] > 0 && ticket[ 4 ] > 0 )
   {
    ButtonSend.Text( "EA Stop" );
     return ;
    }
   while (! IsStopped ())
   {
   if (ButtonSend.Pressed())
     {
      ButtonSend.Text( "Sending..." );
         if ( TerminalInfoInteger ( TERMINAL_CONNECTED ) && TerminalInfoInteger ( TERMINAL_TRADE_ALLOWED ) && !IsTradeContextBusy())
           {
            RefreshRates();
             for ( int i = 0 ; i < 5 ; i++)
              {
               if (sym[i] == "" ) ticket[i] = INT_MAX ;
               if (ticket[i] > 0 ) continue ;
               double vol = NormalizeLot(lot[i],sym[i]);
               ticket[i] = OrderSend (sym[i], OP_SELL, vol, SymbolInfoDouble (sym[i], SYMBOL_BID ), 3 , 0 , 0 , "" , 0 , 0 , clrRed );
              }
           }
        }
     if (ticket[ 0 ] > 0 && ticket[ 1 ] > 0 && ticket[ 2 ] > 0 && ticket[ 3 ] > 0 && ticket[ 4 ] > 0 ) break ;        
     ChartRedraw ();      
     Sleep ( 123 );
     }
  }
//+------------------------------------------------------------------+
double NormalizeLot( const double value, const string sym_, bool up= false )
  {
   double res,sizetable[ 9 ]={ 1.0 , 0.1 , 0.01 , 0.001 , 0.0001 , 0.00001 , 0.000001 , 0.0000001 , 0.00000001 };
   double lotStep= SymbolInfoDouble (sym_,   SYMBOL_VOLUME_STEP );
   int lotdigits;
   for (lotdigits= 8 ; lotdigits>= 0 ; lotdigits--) if (lotStep<=sizetable[lotdigits]) break ;
   if (up) res= NormalizeDouble ( MathCeil ( MathMin ( MathMax (value, SymbolInfoDouble (sym_, SYMBOL_VOLUME_MIN )), SymbolInfoDouble (sym_, SYMBOL_VOLUME_MAX ))/lotStep)*lotStep,lotdigits);
   else res= NormalizeDouble ( MathFloor ( MathMin ( MathMax (value, SymbolInfoDouble (sym_, SYMBOL_VOLUME_MIN )), SymbolInfoDouble (sym_, SYMBOL_VOLUME_MAX ))/lotStep)*lotStep,lotdigits);
   return (res);
  }
//+------------------------------------------------------------------+
 
Igor Makanu :

여기에 일반적으로 문제가 무엇입니까 .... 우리는 터미널, IMHO를 걸기 위해 가능한 모든 것을하고 있습니다 .... 잘못된 논리를 작성하는 것을 좋아하지 않으므로 원하는대로했습니다. 고문을 던졌습니다. 차트에서 버튼을 누르면 무한 루프에서 주문을 열려고 시도합니다.

Igor, 확장된 기능에 감사드립니다! 그러나 불행히도 속도면에서 변경된 것은 없습니다. 거래도 속속 개설됩니다. 나는 다시 각 차트에 최소 버전을 넣으려고 시도했고 "자동 거래"를 클릭했고 즉시 모든 거래가 동시에 즉시 열렸습니다. 초반에 약간의 딜레이가 있었습니다.
그럼에도 불구하고 통합 트레이드 패널 버튼을 클릭하면 초기 지연 없이 단일 거래가 훨씬 빠르게 열립니다. 기이한. 비슷한 버튼이 지체 없이 바구니를 여는 상태로 가다.

실행 속도 측면에서 보면 다음과 같습니다.
1. 가장 빠른 방법은 표준 무역 패널을 클릭하는 것입니다.
2. 여러 차트에 분산하고 "자동 거래"를 클릭합니다.
3. 장바구니를 순차적으로 여는 버튼

 
Ivan Butko :

거래도 연이어 열립니다.

그렇지 않으면 Google 계정 유형에 대한 정보 Market Execution / Instant Execution

그리고 두 번째 순간 https://www.mql5.com/ru/docs/runtime/running

Expert - 자신의 쓰레드에 얼마나 많은 전문가들이 있는지 - 그들에 대한 실행 쓰레드 수

요컨대, 주문을 보낸 후 어드바이저는 주문 확인을 기다리며 다른 차트에 여러 어드바이저가 있는 경우 각 EA의 독립성을 받게 됩니다. 다중 스레드 코드 실행


뉴스 거래를 이해하는 한 귀하의 작업에 대해 가장 최적의 솔루션은 여러 차트를 열고 끝없는 루프로 반복되는 맞춤형 어드바이저를 던지고 주문한 후 어드바이저가 떠나야한다고 생각합니다. 차트, 자동 거래 버튼으로 모든 어드바이저 시작

 
안녕하세요 여러분! 어드바이저의 표준 포물선 표시기가 첫 번째 지점(즉, 시장 추세의 변화)을 생성하기 위해 지연을 열도록 강제하는 방법????
 
ponochka :
안녕하세요 여러분! 어드바이저의 표준 포물선 표시기가 첫 번째 지점(즉, 시장 추세의 변화)을 생성하기 위해 지연을 열도록 강제하는 방법????

처음에는 화살표로 표시된 지점이 현재 가격 의 반대편에 있었습니다. 그리고 가격이 그 지점에 닿자마자 바로 반대편으로 뛰어올랐다.

결론: 상단의 첫 번째 지점은 가격이 하단의 지점에 닿을 때입니다. 그 반대...

 
Igor Makanu :

그렇지 않으면 Google 계정 유형에 대한 정보 Market Execution / Instant Execution

그리고 두 번째 순간 https://www.mql5.com/en/docs/runtime/running

요컨대, 주문을 보낸 후 어드바이저는 주문 확인을 기다리며 다른 차트에 여러 어드바이저가 있는 경우 각 EA의 독립성을 받게 됩니다. 다중 스레드 코드 실행


뉴스 거래를 이해하는 한 귀하의 작업에 대해 가장 최적의 솔루션은 여러 차트를 열고 끝없는 루프로 반복되는 맞춤형 어드바이저를 던지고 주문한 후 어드바이저가 떠나야한다고 생각합니다. 차트, 자동 거래 버튼으로 모든 어드바이저 시작

와...설명 감사합니다. 내 말은. 실제로 현재 것을 연 후에야 다음 것이 열립니다. 호기심이 많은.

네 번째 방식인 딜 복사기를 시도하면 딜도 순차적으로 오픈된다는 사실 알고 계셨나요? 예를 들어, 우리는 복사기에게 마스터에게 7개의 주문이 열려 있다는 신호를 보냅니다... 어떻게 그것을 열까요? 또는 복사기 7대를 넣고 각 복사기를 지정하여 자체 쌍을 복사합니다. 시도 할 수는 있지만 추가로 만들 필요는 없습니다.

리모콘을 사용하는 또 다른 다섯 번째 방법이 있습니다. 그러나 여전히 비싸고 거의 아무도 쓰지 않습니다. 나는 지금 사용 가능한 것을 고수 할 것입니다.


UPD

나는 복사기를 시도했다 - 같은 일, 그것은 거래를 순차적으로 엽니다. 그리고 7개의 차트에 복사기를 놓고 업데이트를 1ms로 설정하면 UPU와 함께 터미널이 폭발합니다.

두 가지 방법이 남아 있습니다.

1. 활성 - 각 차트에 어드바이저를 배치하고 자동 거래를 활성화합니다.
2. 테스트되지 않음 - 타사 리모콘 소프트웨어를 사용합니다.
 
Ivan Butko :

1. 활성 - 각 차트에 어드바이저를 배치하고 자동 거래를 활성화합니다.

2. 테스트되지 않음 - 타사 리모콘 소프트웨어를 사용합니다.

99% 확률로 옵션 1과 2는 동일한 속도로 작동하고 서버는 여전히 거래 요청을 차례로 처리하며 7개의 차트에서 7개의 요청을 보낼 때 서버의 응답을 기다리는 시간을 얻었습니다. 티켓을 받으면 그는 아무 것도하지 않습니다 - 기다립니다)

Clicker에 대해 WinAPI를 사용하면 화면의 아무 곳에서나 "마우스를 찌를" 수 있습니다. 한 달 전에 작업 코드를 확인했습니다. https://www.mql5.com/en/forum/156025#comment_7552799

그러나 그것은 이미 나 없이는 흥미롭지 않습니다. 원칙적으로 당신이 그것을하면 어렵지 않습니다 - 당신은 또한 autoclicker와 함께 autotrade 패널을 사용하여 주문을 보내고 싶기 때문에 @Koldun Zloy 코드를 사용하여 똑같이 할 수 있습니다

 
Igor Makanu :

99% 확률로 옵션 1과 2는 동일한 속도로 작동하고 서버는 여전히 거래 요청을 차례로 처리하며 7개의 차트에서 7개의 요청을 보낼 때 서버의 응답을 기다리는 시간을 얻었습니다. 티켓을 받으면 그는 아무 것도하지 않습니다 - 기다립니다)

Clicker에 대해 WinAPI를 사용하면 화면의 아무 곳에서나 "마우스를 찌를" 수 있습니다. 한 달 전에 작업 코드를 확인했습니다. https://www.mql5.com/en/forum/156025#comment_7552799

그러나 그것은 이미 나 없이는 흥미롭지 않습니다. 원칙적으로 당신이 그것을하면 어렵지 않습니다 - 당신은 또한 autoclicker와 함께 autotrade 패널을 사용하여 주문을 보내고 싶기 때문에 @Koldun Zloy 코드를 사용하여 똑같이 할 수 있습니다

확인하겠습니다. 당신의 도움과 일에 대해 대단히 감사합니다

 

안녕하세요.

MT5를 배우고 있습니다. 그런데 어쩐지 버퍼 라인의 구성이 불명확하네요... mql5 사이트에서 인디케이터를 다운받아 조금 수정했습니다.

그러나 줄이 있는 잼이 있었습니다. 질문: 히스토리의 라인이 왜 깎이고 어떻게 수정합니까?

 //+------------------------------------------------------------------+
//|                                                        Proba.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
//---- для расчета и отрисовки индикатора использовано пятнадцать буферов
#property indicator_buffers 4
//---- использовано пятнадцать графических построений
#property indicator_plots    4
//+----------------------------------------------+
//|  Параметры отрисовки уровня                  |
//+----------------------------------------------+
//---- отрисовка индикатора в виде значка
#property indicator_type1    DRAW_LINE
//---- в качестве цвета линии индикатора цвет MediumSeaGreen
#property indicator_color1 clrGold
//---- толщина линии индикатора равна
#property indicator_width1    1
//---- отображение метки индикатора
#property indicator_label1    "OPEN"
//+----------------------------------------------+
//|  Параметры отрисовки уровня                  |
//+----------------------------------------------+
//---- отрисовка индикатора в виде значка
#property indicator_type2    DRAW_LINE
//---- в качестве цвета индикатора использован цвет MediumSeaGreen
#property indicator_color2 clrRed
//---- толщина линии индикатора равна
#property indicator_width2    1
//---- отображение лэйбы индикатора
#property indicator_label2    "CLOSE"
//+----------------------------------------------+
//|  Параметры отрисовки уровня                  |
//+----------------------------------------------+
//---- отрисовка индикатора в виде значка
#property indicator_type3    DRAW_LINE
//---- в качестве цвета индикатора использован цвет Lime
#property indicator_color3 clrYellow
//---- толщина линии индикатора равна
#property indicator_width3    2
//---- отображение метки индикатора
#property indicator_label3    "HIGH"
//+----------------------------------------------+
//|  Параметры отрисовки уровня                  |
//+----------------------------------------------+
//---- отрисовка индикатора в виде значка
#property indicator_type4    DRAW_LINE
//---- в качестве цвета индикатора использован цвет MediumSeaGreen
#property indicator_color4 clrYellow
//---- толщина индикатора равна
#property indicator_width4    1
//---- отображение метки индикатора
#property indicator_label4    "LOW"
//+----------------------------------------------+
//| Входные параметры индикатора                 |
//+----------------------------------------------+
input int   ExtHowManyDays= 10 ; //Количество Дней истории
input ENUM_TIMEFRAMES Timeframes = PERIOD_D1 ; //Период расчетов
//+----------------------------------------------+
//---- объявление динамических массивов, которые в дальнейшем
//---- будут использованы в качестве индикаторных буферов
double BufferLow[],BufferHigh[],BufferClose[],BufferOpen[];
//+------------------------------------------------------------------+
//| iBarShift() function                                             |
//+------------------------------------------------------------------+
int iBarShift ( string symbol, ENUM_TIMEFRAMES timeframe, datetime time)
  {
//----
   if (time< 0 )
       return (- 1 );
   datetime Arr[],time1;

   time1=( datetime ) SeriesInfoInteger (symbol,timeframe, SERIES_LASTBAR_DATE );

   if ( CopyTime (symbol,timeframe,time,time1,Arr)> 0 )
     {
       int size= ArraySize (Arr);
       return (size- 1 );
     }
   else
       return (- 1 );
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit ()
  {
//---
   int draw_begin;
   if (ExtHowManyDays < 1 )
      draw_begin= 0 ;
   else
      draw_begin=ExtHowManyDays;

//---- превращение динамических массивов в индикаторные буферы
   SetIndexBuffer ( 0 ,BufferOpen, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,BufferClose, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,BufferHigh, INDICATOR_DATA );
   SetIndexBuffer ( 3 ,BufferLow, INDICATOR_DATA );
//---- создание метки для отображения в DataWindow
   PlotIndexSetString ( 0 , PLOT_LABEL , "Price OPEEN" );
   PlotIndexSetString ( 1 , PLOT_LABEL , "Price CLOSE" );
   PlotIndexSetString ( 2 , PLOT_LABEL , "Price HIGH" );
   PlotIndexSetString ( 3 , PLOT_LABEL , "Price LOW" );
//---- индексация элементов в буферах как в таймсериях
   ArraySetAsSeries (BufferOpen, true );
   ArraySetAsSeries (BufferClose, true );
   ArraySetAsSeries (BufferHigh, true );
   ArraySetAsSeries (BufferLow, true );
//---- определение точности отображения значений индикатора
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//--- установим номер бара, с которого будет идти отрисовка
   for ( int q= 0 ; q<= 4 ; q++)
       PlotIndexSetInteger (q, PLOT_DRAW_BEGIN ,draw_begin); // ПРОБЛЕМА ТУТ!!!!!
       //PlotIndexSetInteger(q,PLOT_SHIFT,0);
       //PlotIndexSetDouble(q,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,     // количество истории в барах на текущем тике
                 const int prev_calculated, // количество истории в барах на предыдущем тике
                 const datetime &time[],
                 const double &open[],
                 const double & high[],     // ценовой массив максимумов цены для расчета индикатора
                 const double & low[],       // ценовой массив минимумов цены  для расчета индикатора
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---- объявления локальных переменных
   int     begin_bar,first_bar,last_bar,cnt,copy;
   double High_= 0.0 ,Low_= 0.0 ,Close_= 0.0 ,Open_= 0.0 ;
   double iClose [], iOpen [], iHigh [], iLow [];
   datetime iTime [];
//---
   if ( _Period >=Timeframes)
       return ( 0 );
//---- проверка и установка начального бара
   if (ExtHowManyDays < 1 )
      begin_bar= Bars ( NULL ,Timeframes)- 2 ;
   else
      begin_bar=ExtHowManyDays- 1 ;

//---- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries (time, true );
   ArraySetAsSeries ( iTime , true );
   ArraySetAsSeries ( iOpen , true );
   ArraySetAsSeries ( iClose , true );
   ArraySetAsSeries ( iHigh , true );
   ArraySetAsSeries ( iLow , true );

   copy=begin_bar+ 2 ;

   if ( CopyTime ( NULL ,Timeframes, 0 ,copy, iTime )<copy)
       return ( 0 );
   if ( CopyOpen ( NULL ,Timeframes, 0 ,copy, iOpen )<copy)
       return ( 0 );
   if ( CopyClose ( NULL ,Timeframes, 0 ,copy, iClose )<copy)
       return ( 0 );
   if ( CopyHigh ( NULL ,Timeframes, 0 ,copy, iHigh )<copy)
       return ( 0 );
   if ( CopyLow ( NULL ,Timeframes, 0 ,copy, iLow )<copy)
       return ( 0 );

//----
   /*cnt=0;
   while(true)
     {
      if(iTime[0]>=(time[0]-Timeframes*60))
         break;
      cnt++;
      if(cnt>5)
         return(0);
      Sleep(300); //1000
     }*/
//----
   if (prev_calculated!= 0 )
     {
      begin_bar= 0 ;
      BufferOpen[cnt]= 0.0 ;
      BufferClose[cnt]= 0.0 ;
      BufferHigh[cnt]= 0.0 ;
      BufferLow[cnt]= 0.0 ;
     }
//----
   for (cnt=begin_bar; cnt>= 0 ; cnt--)
     {
       if (cnt<rates_total)
        {
         Open_= iOpen [cnt];
         Close_= iClose [cnt+ 1 ];
         High_= iHigh [cnt+ 1 ];
         Low_= iLow [cnt+ 1 ];
        }
      first_bar= iBarShift ( NULL , _Period , iTime [cnt]);

       if (cnt> 0 )
         last_bar= iBarShift ( NULL , _Period , iTime [cnt- 1 ]);
       else
         last_bar= 0 ;

       while (first_bar>=last_bar)
        {
         if ((first_bar==last_bar && last_bar> 0 ) || first_bar< 0 )
             break ;

         BufferOpen[first_bar]=Open_;
         BufferClose[first_bar]=Close_;
         BufferHigh[first_bar]=High_;
         BufferLow[first_bar]=Low_;
         if (BufferOpen[first_bar]!=BufferOpen[first_bar+ 1 ])
            BufferOpen[first_bar+ 1 ]= EMPTY_VALUE ;
         if (BufferClose[first_bar]!=BufferClose[first_bar+ 1 ])
            BufferClose[first_bar+ 1 ]= EMPTY_VALUE ;
         if (BufferHigh[first_bar]!=BufferHigh[first_bar+ 1 ])
            BufferHigh[first_bar+ 1 ]= EMPTY_VALUE ;
         if (BufferLow[first_bar]!=BufferLow[first_bar+ 1 ])
            BufferLow[first_bar+ 1 ]= EMPTY_VALUE ;

         first_bar--;
        }
     }
//----
   ChartRedraw ( 0 );
//----
   return (rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+



사유: