Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 1130
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
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ş?
CopyTime kullanın, grafik nesnelerini çizerken de bu sorunu fark ettim ve CopyTime sorunu çözdü
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?
Denemedim, hemen normal bir evrensel çözüm uyguladım ve sorunu unuttum.
evet, ihtiyacınız olan şey hakkında, sadece 4ku altında bitirmek için onu anlamaya devam ediyor
//| 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 );
} //******************************************************************|
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.
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ı?