Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 1130

 
Artyom Trishkin :
IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
teşekkürler moderatör)
 
trader781 :

Herkese merhaba, zaten orada olanı iyileştirmeye devam ediyorum

Düzensiz bir sipariş ızgaramız ve her yerde olabilen yatay bir çizgimiz var.

bunu uygulamanız gerekir:

fiyatımız çizginin altındaysa, tüm siparişleri kapatın

zorluklar şu ki

1) siparişler düzensiz tipteyse ve ne zaman yerleştirileceği, işaretleneceği ve ayarlanacağı değil, hattı yerleştirirken herhangi bir şey gizliyse (ve o zaman hala bir tür bayrak açma / kapamaya ihtiyacınız var)

2) türe göre satırın en üstünde sağdaki yazının uygulanması (siparişler bu fiyattan kapatılırsa, sonuç bakiyeye göre olacaktır, yani zaten her tikte ve ayrıca ne zaman ekranı değiştirmeniz gerekiyor? satırı, genel olarak, manuel olarak sipariş verirken tp veya sl'ye benzer şekilde hareket ettirmek, yalnızca kayan ve başlangıçta yanlış pozitif olasılığı ile)

bir robot var, sayısal etiket dışında her şey zaten çizildi, soru değerlerin doğru atanması ve tüm ızgara bilgilerinin işlenmesidir.

Şuna bir bak, işe yarayabilir.
TralingLine
TralingLine
  • oylar: 13
  • 2016.09.26
  • Alexey Viktorov
  • www.mql5.com
Виртуальный Stop Loss или Trailing Stop.
 
Alexey Viktorov :
Şuna bir bak, işe yarayabilir.
evet, neye ihtiyaç duyulduğu hakkında, sadece 4k altında bitirmek için anlamaya devam ediyor
 
Nauris Zukas :
Merhaba. iTime neden bazen yanlış zaman veriyor anlamıyorum. Yeni bir PERIOD_H1 mumunun açılması, Print(iTime(NULL, PERIOD_M1 ,30)) günlüğündeki zamanı göstermelidir. Testlerde her şey doğru görüntüleniyor, ancak gerçek hayatta bazen zaman birkaç saat bile farklılık gösteriyor. Nedenmiş?
Vitaly Muzichenko :

CopyTime kullanın, grafik nesnelerini çizerken de bu sorunu fark ettim ve CopyTime sorunu çözdü

datetime TM[];
if ( CopyTime ( Symbol (), Period (), 0 , 1 ,TM)< 0 ) return ;
TIME0=TM[ 0 ];
Ben düşündüm ve eğer RefreshRates() koydu. Belki bu da yardımcı olur?
 
Nauris Zukas :
Ben düşündüm ve eğer RefreshRates() koydu. Belki bu da yardımcı olur?
Denemedim, hemen normal bir evrensel çözüm uyguladım ve sorunu unuttum.
 
Vitaly Muzichenko :
Denemedim, hemen normal bir evrensel çözüm uyguladım ve sorunu unuttum.
Tamam, ilgi uğruna, bir terminalde RefreshRates() ve diğerinde CopyTime ile yapacağım .
 
trader781 :
evet, ihtiyacınız olan şey hakkında, sadece 4ku altında bitirmek için onu anlamaya devam ediyor
İlk önce, mql4 altında derleyin ve kontrol edin. Çalışmalı. İşe yaramazsa, işte eski mql4 kodu. Ve hatta hata işleme ile.

//*******************************************************************|
//|                                                  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 :
Tamam, ilgi uğruna, bir terminalde RefreshRates() ve diğerinde CopyTime ile yapacağım.
Zaman kayması sorunu test cihazında iyi bir şekilde ortaya çıktı, bu nedenle RefreshRates yardımcı olmayabilir.
 
Vitaly Muzichenko :
Zaman kayması sorunu test cihazında iyi bir şekilde ortaya çıktı, bu nedenle RefreshRates yardımcı olmayabilir.
Açıkçası, o zaman CopyTime ile yapıyorum.
 

1. Terminaller arasında uzman göstergelerini ve komut dosyalarını senkronize etmek için uygun bir araç var mı? (Örneğin, bir terminalde programlıyorum, sonra uzmanın ticaretin gerçekleştiği terminallere göndermem gerekiyor)

2. Çalışan bir çizelge üzerinde bir Expert Advisor'ın otomatik olarak güncellenmesi (yeni bir sürüm yüklenmesi) örneği var mı?