포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 1130

 
Artyom Trishkin :
IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
고마워 모드)
 
trader781 :

안녕하세요 여러분, 저는 이미 존재하는 것을 계속해서 다듬고 있습니다.

우리는 고르지 않은 주문 그리드와 어디에나 있을 수 있는 수평선 을 가지고 있습니다.

이것을 구현해야 합니다.

가격이 선 아래에 있으면 모든 주문을 닫으십시오.

어려움은

1) 주문이 고르지 않은 유형이고 선을 배치할 때 숨겨진 것이 있고 배치, 표시 및 설정이 아닌 경우(그런 다음에도 여전히 어떤 종류의 플래그를 설정/해제해야 함)

2) 유형별로 라인 상단의 오른쪽에 있는 비문 구현(주문이 이 가격으로 마감된 경우 결과는 잔액에 따라 결정됩니다. 즉, 매 틱마다 디스플레이를 변경해야 하며 또한 언제 일반적으로 수동으로 주문할 때 tp 또는 sl과 유사하게 라인을 이동하고 처음에는 가양성(false positive) 가능성이 있는 유동만 있음)

로봇이 있지만 모든 것이 이미 그려진 숫자 레이블을 제외하고 문제는 값의 올바른 할당과 전체 그리드의 정보 처리에 있습니다.

이것을보십시오. 작동 할 수 있습니다.
TralingLine
TralingLine
  • 투표: 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov :
이것을보십시오. 작동 할 수 있습니다.
예, 필요한 것에 대해 4k 미만으로 끝내기 위해 알아내는 것만 남아 있습니다.
 
Nauris Zukas :
안녕하세요. iTime이 때때로 잘못된 시간을 제공하는 이유를 이해하지 못합니다. 새 PERIOD_H1 양초를 열면 Print(iTime(NULL, PERIOD_M1 ,30)) 로그에 시간이 표시되어야 합니다. 테스트에서는 모든 것이 올바르게 표시되지만 실제 생활에서는 시간이 몇 시간씩 차이가 나는 경우도 있습니다. 왜 그런 겁니까?
비탈리 무지첸코 :

CopyTime 사용

datetime TM[];
if ( CopyTime ( Symbol (), Period (), 0 , 1 ,TM)< 0 ) return ;
TIME0=TM[ 0 ];
생각하고 RefreshRates()를 넣으면. 이것도 도움이 될까요?
 
Nauris Zukas :
생각하고 RefreshRates()를 넣으면. 이것도 도움이 될까요?
나는 그것을 시도하지 않았고 즉시 일반적인 범용 솔루션을 적용하고 문제를 잊어 버렸습니다.
 
Vitaly Muzichenko :
나는 그것을 시도하지 않았고 즉시 일반적인 범용 솔루션을 적용하고 문제를 잊어 버렸습니다.
좋습니다. 관심을 끌기 위해 한 터미널에서는 RefreshRates() 를 사용하고 다른 터미널에서는 CopyTime 으로 작업을 수행하겠습니다 .
 
trader781 :
예, 필요한 것에 대해 4ku 미만으로 끝내기 위해 알아내는 것만 남아 있습니다.
먼저 mql4에서 컴파일하고 확인하십시오. 작동해야 합니다. 작동하지 않으면 여기에 이전 mql4 코드가 있습니다. 그리고 오류 처리 를 사용하는 경우에도 마찬가지입니다.

//*******************************************************************|
//|                                                  TralingLine.mq4 |
//|                                       Copyright © 2010, Viktorov |
//|                                                   v4forex@qip.ru |
//*******************************************************************|
#property copyright "Copyright © 2010, Viktorov"
#property link        "v4forex@qip.ru"

extern int      StopLevel   = 7 ;
extern color    ColorLine   = IndianRed;
extern bool     comment     =   false ;

double prbuys, prsels, TICKVALUE, FixProfitBuy, FixProfitSel;
int Buy, Sel;

//****************expert initialization function*********************|
   bool      run         = True ,
            Error       = False ;
   int       slip        =   3 ;
   double    point,
            STOPLEVEL;
int init()
  {
  point  = Point ;
   if (( Digits == 3 || Digits == 5 ))
  {
  point  = Point * 10 ;
  slip   *= 10 ;
  }
  run = True ;
  Error = False ;
TICKVALUE = MarketInfo ( Symbol (), MODE_TICKVALUE );

   return ( 0 );
} //******************************************************************|
double    nd( double v){ return ( NormalizeDouble (v, Digits ));}
string    dts( double v){ return ( DoubleToStr (v, Digits ));}
string    dts2( double v){ return ( DoubleToStr (v, 2 ));}
string    ttss( int v){ return ( TimeToStr (v, TIME_SECONDS ));}
//*******************************************************************|
//|                     expert start function                        |
//*******************************************************************|
int start()
  {
     double nprbuys, nprsels;
   CountTrades();
  
   if (Buy > 0 && ObjectFind ( "StopBuy" ) == - 1 ) drawline( OP_BUY );
   if (Sel > 0 && ObjectFind ( "StopSel" ) == - 1 ) drawline( OP_SELL );
   if ( ObjectFind ( "StopBuy" ) != - 1 )
   nprbuys = ObjectGetValueByShift ( "StopBuy" , 0 );
   if ( ObjectFind ( "StopSel" )!=- 1 )
   nprsels = ObjectGetValueByShift ( "StopSel" , 0 );
  
   if (nprbuys > 0 && Bid <= nprbuys)
   {
    CloseOrder( OP_BUY );
     if ( ObjectFind ( "StopBuy" ) != - 1 ) ObjectDelete ( "StopBuy" );
   }
   if (nprsels > 0 && Ask >= nprsels)
   {
    CloseOrder( OP_SELL );
     if ( ObjectFind ( "StopSel" ) != - 1 ) ObjectDelete ( "StopSel" );
   }
      FixProfit();
     if (comment)
   Comment ( "\n Текущее время  " , ttss( TimeCurrent ())
         , "\n Ордера Buy закроются по цене " , dts(nprbuys), ". Фиксированная прибыль " , dts2(FixProfitBuy)
         , "\n Ордера Sell закроются по цене " , dts(nprsels), ". Фиксированная прибыль " , dts2(FixProfitSel)
         );
   return ( 0 );
} //******************************************************************|
  
//********************Подсчёт профита всех ордеров*******************|
void FixProfit()
{   double LineB, LineS, Profit, tv;
   LineB = nd( ObjectGetValueByShift ( "StopBuy" , 0 ));
   LineS = nd( ObjectGetValueByShift ( "StopSel" , 0 ));
    tv = TICKVALUE; FixProfitBuy = 0 ; FixProfitSel = 0 ;
     int Total = OrdersTotal ();
  
   for ( int i = Total- 1 ; i >= 0 ; i--)
    {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
     {
     if ( OrderSymbol () == Symbol ())
       {
         if ( OrderType () == OP_BUY && LineB > 0 )
         {
           if ( StringSubstr ( Symbol (), 0 , 3 ) == "USD" ) tv = TICKVALUE* Bid /LineB;
          FixProfitBuy += ( OrderCommission () + OrderSwap () + (LineB - OrderOpenPrice ())*tv* OrderLots ()/ Point );
         }
         if ( OrderType () == OP_SELL && LineS > 0 )
         {
           if ( StringSubstr ( Symbol (), 0 , 3 ) == "USD" ) tv = TICKVALUE* Bid /LineS;
          FixProfitSel += ( OrderCommission () + OrderSwap () + ( OrderOpenPrice () - LineS)*tv* OrderLots ()/ Point );
         }
       }
     Profit += OrderProfit ();
     }
    }
} //******************************************************************|

//*******Подсчёт открытых ордеров OP_BUY & OP_BUYSTOP****************|
         void CountTrades()
           {   Buy = 0 ; Sel = 0 ;
             int Total = OrdersTotal ();
             for ( int i = 0 ; i < Total; i++)
             {
               if ( OrderSelect (i, SELECT_BY_POS ))
              {
               if ( OrderSymbol () == Symbol ())
               {
               if ( OrderType () == OP_BUY ) Buy++;
                   if ( OrderType () ==   OP_SELL ) Sel++;
               }
              }
             } //for
           } //*******************************************************|

//**********************рисование линий******************************|
void drawline( int sig)
{
   double    Otstup_ = StopLevel*point;
     if (sig == OP_BUY )
     {
      prbuys = nd( iLow ( NULL , 0 , 1 )-Otstup_);
       ObjectCreate ( "StopBuy" , OBJ_TREND , 0 , Time [ 0 ]+ 2 * Period ()* 60 , prbuys, Time [ 0 ]+ 4 * Period ()* 60 , prbuys);
       ObjectSet ( "StopBuy" , OBJPROP_COLOR , ColorLine);
       ObjectSet ( "StopBuy" , OBJPROP_STYLE , STYLE_DOT );
     }
     if (sig == OP_SELL )
     {
      prsels = nd( iHigh ( NULL , 0 , 1 )+Otstup_);
       ObjectCreate ( "StopSel" , OBJ_TREND , 0 , Time [ 0 ]+ 2 * Period ()* 60 , prsels, Time [ 0 ]+ 4 * Period ()* 60 , prsels);  
       ObjectSet ( "StopSel" , OBJPROP_COLOR , ColorLine);
       ObjectSet ( "StopSel" , OBJPROP_STYLE , STYLE_DOT );
     }
   return ;
} //******************************************************************|

//********************Закрытие ордеров*******************************|
void CloseOrder( int sig)
{     double GH, FE, c = 0 ; bool OrdClose; int Total = OrdersTotal ();

             for ( int i = 0 ; i < Total; i++)
              {
               OrdClose = False ;
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderSymbol () == Symbol ())
      {
       if ( OrderType () == sig)
       {
       while (!OrdClose) // Цикл закрытия ордера 8 попыток
            {
       RefreshRates ();
         if ( OrderType () == OP_BUY )  GH = Bid ;
   else if ( OrderType () == OP_SELL ) GH = Ask ;
      OrdClose =   OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble (GH, Digits ), slip, CLR_NONE);
               if (OrdClose) i--;
         if (!OrdClose)
         {
      FE = Fun_Error( GetLastError ());
             if (FE == 1 ) {   continue ;   } // Повторная попытка
       else if (FE == 0 ) { Print ( "Неудачная попытка CloseOrder Error = " , GetLastError ()); return ;}
       else {   Print ( "Неудачная попытка CloseOrder" ); return ;   }
         }
            } // Цикл while(c < 8)
       }
      }
              } //for
   return ;
} //******************************************************************|

//*********************Ф-ия обработки ошибок*************************|
int Fun_Error( int error)
{
       switch (error)
   { // Преодолимые ошибки
   case 0 : return ( 1 );
   case 4 : //Print("Торговый сервер занят. Пробуем ещё раз...");
   Sleep ( 500 ); // Простое решение
   return ( 1 ); // Выход из функции
   case 128 :   //Истек срок ожидания совершения сделки
   return ( 1 );
   case 6 : //Print("Нет связи с торговым сервером. Пробуем ещё раз...");
   Sleep ( 10000 ); // Простое решение
   return ( 1 ); // Выход из функции
   case 129 : //Print("Цена изменилась. Пробуем ещё раз...");
   return ( 1 ); // Выход из функции
   case 132 : //Print("Рынок закрыт. Пробуем ещё раз...");
   Sleep ( 123000 ); // Простое решение
   return ( 1 ); // Выход из функции
   case 135 : //Print("Цена изменилась. Пробуем ещё раз...");
   RefreshRates (); // Обновим данные
   return ( 1 ); // Выход из функции
   case 136 : //Print("Нет цен. Ждём новый тик...");
   while ( RefreshRates ()== false ) // До нового тика
   Sleep ( 1 ); // Задержка в цикле
   return ( 1 ); // Выход из функции
   case 137 : //Print("Брокер занят. Пробуем ещё раз...");
   Sleep ( 500 ); // Простое решение
   return ( 1 ); // Выход из функции
   case 138 : //Print("Новые цены. Пробуем ещё раз...");
   Sleep ( 1 ); // Задержка в цикле
   return ( 1 ); // Выход из функции
   case 146 : //Print("Подсистема торговли занята. Пробуем ещё...");
   Sleep ( 500 ); // Простое решение
   return ( 1 ); // Выход из функции
   case 4107 : //Print("Неправильный параметр цены для торговой функции. Пробуем ещё...");
   Sleep ( 50 ); // Простое решение
   return ( 1 ); // Выход из функции
// Критические ошибки
   case 1 :
   return ( 0 );
   case 2 : Alert ( "Общая ошибка. Перегрузите терминал и\или компьютер." );
   return ( 0 ); // Выход из функции
   case 5 : Alert ( "Старая версия терминала." );
   //Work=false; // Больше не работать
   return ( 0 ); // Выход из функции
   case 64 : Alert ( "Счет заблокирован." );
   //Work=false; // Больше не работать
   return ( 0 ); // Выход из функции
   case 130 : //Alert("Неправильные стопы.");
   return ( 0 ); // Выход из функции
   case 133 : Alert ( "Торговля запрещена." );
   return ( 0 ); // Выход из функции
   case 134 : Alert ( "Недостаточно денег для совершения операции." );
   return ( 0 ); // Выход из функции
   case 4051 : Alert ( "Недопустимое значение параметра функции." );
   return ( 0 ); // Выход из функции
   case 4108 : Alert ( "Неверный номер тикета." );
   return ( 0 ); // Выход из функции
   default : //Print("Возникла ошибка ",Error); // Другие варианты
   return ( 0 ); // Выход из функции
   }
} //******************************************************************|

//****************expert deinitialization function*******************|
int deinit()
  {
   ObjectDelete ( "StopBuy" );
   ObjectDelete ( "StopSel" );
   return ( 0 );
} //******************************************************************|

 
Nauris Zukas :
알겠습니다. 한 터미널에서는 RefreshRates()를 사용하고 다른 터미널에서는 CopyTime으로 작업을 수행하겠습니다.
시간 오프셋 문제는 테스터에서 잘 나타나므로 RefreshRates가 도움이 되지 않을 수 있습니다.
 
Vitaly Muzichenko :
시간 오프셋 문제는 테스터에서 잘 나타나므로 RefreshRates가 도움이 되지 않을 수 있습니다.
분명히, 나는 CopyTime 을 사용합니다.
 

1. 터미널 간에 전문가 지표와 스크립트를 동기화할 수 있는 편리한 도구가 있습니까? (예를 들어, 한 터미널에서 프로그래밍한 다음 거래가 발생하는 터미널로 전문가를 보내야 함)

2. 작업 차트에 Expert Advisor의 자동 업데이트 (새 버전 로드)의 예가 있습니까?