WHRoeder : İşte benim eksi gerçek ticaret mantığı.
İşlem saati/gün filtresiyle ilgili bir PM aldım. Talep Pazartesi-Cuma 1800-0600 idi. Bu, Pazartesi günü 0-0600 ve Cuma günü 1800-kapanışı hariç tutmayı gerektirir. Kod, zaman aşımına izin verdi, ancak günlerce izin vermedi. Artırma:
/*++++ Day/Time allowed to open*/ {
datetime now = TimeGMT ();
//extern double TradeHr.UTC.Start = 7.3; // London-1//extern double TradeHr.UTC.End = 12.9; // NY openint secStart = 3600 *TradeHr.UTC.Start,
secEnd = 3600 *TradeHr.UTC.End,
hrBeg = (now-secStart+ 86400 )% 86400 ,
hrEnd = (now-secEnd + 86400 )% 86400 ;
if (hrBeg > hrEnd){ double Tminus=hrBeg/ 3600 .- 24 ;
StrApnd(EA.status, " HR" , DoubleToStr (Tminus, 2 )); return ; }
// TradeHr: 0600-1800 1800-0600 1800-0600// TOD: 0600-1800 1800-2359 0000-0600// DOW: DOW(today) DOW(today) DOW(yesterday)int TOD = now % 86400; // Time of the daydatetime BOD = now - TOD; // Beginning of the day (today 0000z)if (TOD < secStart) int DOW = TimeDayOfWeek (BOD - 1 ); // Yesterday.else DOW = TimeDayOfWeek (BOD), /* https://www.mql5.com/en/forum/127483
// reports DayOfWeek() always returns 5 in the tester. No refresh?*/int DayMask = 1 << DOW; // #define DAYS_MAX 0x3F// 1<<6-1=63. (S-F)//extern int Days.Mask = 55; // Not Wedif ((Days.Mask & DayMask) == 0 ){ StrApnd(EA.status, " Day=" ,DOW); return ; }
/*---- Day/Time allowed to open*/ }
double PointValuePerLot( string pair= "" ) {
/* Value in acnSum currency of a Point of Symbol.
* In tester I had a sale: open=1.35883 close=1.35736 (0.00147)
* gain$=97.32/6.62 lots/147 points=$0.10/point or $1.00/pip.
* IBFX demo/mini EURUSD TICKVALUE=0.1 MAXLOT=50 LOTSIZE=10,000
* IBFX demo/standard EURUSD TICKVALUE=1.0 MAXLOT=50 LOTSIZE=100,000
* $1.00/point or $10.00/pip.
*
* https://www.mql5.com/en/forum/127584 CB: MODE_TICKSIZE will usually return the
* same value as MODE_POINT (or Point for the current symbol), however, an
* example of where to use MODE_TICKSIZE would be as part of a ratio with
* MODE_TICKVALUE when performing money management calculations which need
* to take acnSum of the pair and the acnSum currency. The reason I use
* this ratio is that although TV and TS may constantly be returned as
* something like 7.00 and 0.00001 respectively, I've seen this
* (intermittently) change to 14.00 and 0.00002 respectively (just example
* tick values to illustrate). */if (pair == "" ) pair = Symbol ();
return ( MarketInfo (pair, MODE_TICKVALUE)
/ MarketInfo (pair, MODE_TICKSIZE) ); // Not Point.
}
WHRoeder : Ve RaptorUK'unyorumu için yaptığım düzeltme:
aCurrencyChange = aPriceChange * OrderSize() * DeltaValuePerLot() olduğundan PointValuePerLot'u DeltaValuePerLot olarak yeniden adlandırdım. Ayrıca daha fazla yorum ekledi.
double PipValuePerLot( string pair= "" ){ return (DeltaValuePerLot() * pips2dbl); }
double DeltaValuePerLot( string pair= "" ){
/* Value in account currency of a Point of Symbol.
* In tester I had a sale: open=1.35883 close=1.35736 (0.0147)
* gain$=97.32/6.62 lots/147 points=$0.10/point or $1.00/pip.
* IBFX demo/mini EURUSD TICKVALUE=0.1 MAXLOT=50 LOTSIZE=10,000
* IBFX demo/standard EURUSD TICKVALUE=1.0 MAXLOT=50 LOTSIZE=100,000
* $1.00/point or $10.0/pip.
*
* https://www.mql5.com/en/forum/127584 CB: MODE_TICKSIZE will usually return the
* same value as MODE_POINT (or Point for the current symbol), however, an
* example of where to use MODE_TICKSIZE would be as part of a ratio with
* MODE_TICKVALUE when performing money management calculations which need
* to take account of the pair and the account currency. The reason I use
* this ratio is that although TV and TS may constantly be returned as
* something like 7.00 and 0.0001 respectively, I've seen this
* (intermittently) change to 14.00 and 0.0002 respectively (just example
* tick values to illustrate).
* https://www.mql5.com/en/forum/135345 zzuegg reports for non-currency DE30:
* MarketInfo(Symbol(),MODE_TICKSIZE) returns 0.5
* MarketInfo(Symbol(),MODE_DIGITS) return 1
* Point = 0.1
* Prices to open must be a multiple of ticksize */if (pair == "" ) pair = Symbol ();
return ( MarketInfo (pair, MODE_TICKVALUE)
/ MarketInfo (pair, MODE_TICKSIZE) ); // Not Point.
}
WHRoeder : Hem ana çizelgede hem de alt çizelgede gösterge çizimiyle ilgili bir gönderiden, TLine değişikliklerle her ikisi için de kullanılabilir. Alt çizelge üzerinde çizim yapmak için sadece iWin = WindowFind("indicatorName"); işlevini kullanın.
SL'yi geçerek hafta sonundaki pazar boşluğunun zarar görmesini önlemek için tüm siparişleri hafta sonundan önce kapatmak istedim (piyasa Cuma günü kapanır). (Bu, test cihazında modellenmemiştir.)
Yani soru şu ki, piyasa ne zaman kapanıyor (veya açılıyor)? İnternetteki tüm ilanlar ve aramalar tamamenyanlış.Forex Eğitiminden - Forex'e Giriş - IBFXForex piyasası haftanın 5.5 günü, günde 24 saat çalışır (Pazar günü 18:00 ET'den Cuma 16:00 ET'ye kadar) Bu, ET - New York yerel saatidir.
Bu, DST sınırları yıldan yıla değiştiğinden, Tüm kayıtların ne zaman yapıldığına bağlı olduğu anlamına gelir.
Bu, söz konusu çubuk için NY DST'nin ne zaman başlayıp bittiğini hesaplamanın gerekli olduğu anlamına gelir. (Geriye dönük testler için en azından 2000 değerlerine ihtiyacımız var.) Sorun şu ki, Windows mevcut TZ ve UTC arasında ve yalnızca mevcut yıl için dönüştürme rutinleri sağlamaz. PC ET'de değilse, doğrudan yapılamaz. Dahası, Windows8 çıkana kadar ET ve önceki yıllar için dönüşüm alamazsınız. Ve Win7'deki Kayıt Defterine baktığımda, değerler sadece 2005'i kapsıyor (ve eğer doğru okursam bunlar yanlıştı.) Yani Win8'in daha iyi olacağına bahse girmiyorum.
Bu, DST'yi kendim hesaplamam gerektiği anlamına gelir. Kodumu güncelledim: TimeGmt() ve LocalTimeGMT() varsayılan argümanlar, bazı ek belgeler ve kontrollerle ve piyasa kapanış zamanını hesaplamak için kod yazdım. Zevk almak.
#define HR2400 86400// 24 * 3600datetime TimeOfDay( datetime when){ return ( when % HR2400 ); }
datetime DateOfDay( datetime when){ return ( when - TimeOfDay(when) ); }
datetime now.srv, now.utc, mkt.closes.srv;
:
now.srv = TimeCurrent ();
now.utc = TimeGMT (now.srv); // May update Srvr.To.UTC.Hoursif (now.srv > mkt.closes.srv){ // Compute next market close// Market closes Friday 4PM ET (NY local time) and opens Sunday 6PM ET.// That's either 2100z or 2000z depending on DST.// 18:00 Friday in America/New_York// 12:00 Friday in Pacific/Honolulu// 08:00 Saturday in Australia/Melbourne// 07:00 Saturday in Asia/Tokyo#define DOW_FRIDAY 5#define HR2100 75600// 21 * 3600#define NY_TZ - 18000// -5 * 3600 UTC-5 (STD) or UTC-4 (DST)datetime mktClosesUTC = DateOfDay(now.utc)
+ HR2400*(DOW_FRIDAY - TimeDayOfWeek (now.utc))
+ HR2100;
if (IsNYonDST(mktClosesUTC + NY_TZ)) mktClosesUTC -= 3600 ; // UTC-4
mkt.closes.srv = TimeServer(mktClosesUTC);
} // Compute next market close
:
//+------------------------------------------------------------------+//| GMT Time |//+------------------------------------------------------------------+datetimeTimeGMT ( datetime serverTime= 0 ){ // Server time to GMT time.if (serverTime == 0 ) serverTime = TimeCurrent ();
staticdatetime nextAutoUpdate; if (serverTime >= nextAutoUpdate){
nextAutoUpdate = serverTime + 7200 ;
if (Srvr.To.UTC.Auto
) if ( IsDllsAllowed ()){ // Complained @ initint srvrToUTC = LocalTimeGMT() - TimeCurrent ();
double nearestHalfHour = MathRound (srvrToUTC / 1800 .);
Srvr.To.UTC.Hours = nearestHalfHour / 2 .; // Update external
} }
return (serverTime + Srvr.To.UTC.Hours* 3600 .);
}
datetime TimeServer( datetime gmtTime){ // Server time to GMT time.return (gmtTime - Srvr.To.UTC.Hours* 3600 .);
}
#import "kernel32.dll"int GetTimeZoneInformation( int & TZInfoArray[]);
#importdatetime LocalTimeGMT(){ // TimeLocal to GMT forum.mql4.com/12057#522900// This is called only by TimeGMT. Check for IsDLLsAllowed() done there.int TZInfoArray[ 43 ];
int tz = GetTimeZoneInformation(TZInfoArray);
int GMTshift = TZInfoArray[ 0 ]; // GetTimeZoneInformation will return#define TIME_ZONE_ID_DAYLIGHT 2// the right Bias even when it returns#define TIME_ZONE_ID_UNKNOWN 0// UNKNOWNif (tz == TIME_ZONE_ID_DAYLIGHT || tz == TIME_ZONE_ID_UNKNOWN)
GMTshift += TZInfoArray[ 42 ];
return ( TimeLocal () + GMTshift* 60 );
/*
* msdn.microsoft.com/en-us/library/windows/desktop/ms724421%28v=vs.85%29.aspx
* typedef struct _TIME_ZONE_INFORMATION { typedef struct _SYSTEMTIME {
* LONG Bias; [ 0] (min) WORD wYear; [0]
* WCHAR StandardName[32]; [ 1] WORD wMonth; Jan=1
* SYSTEMTIME StandardDate; [17] WORD wDayOfWeek; [1] Sun=1
* LONG StandardBias; [21] WORD wDay;
* WCHAR DaylightName[32]; [22] WORD wHour; [2]
* SYSTEMTIME DaylightDate; [38] WORD wMinute;
* LONG DaylightBias; [42] WORD wSecond; [3]
* } WORD wMilliseconds; }
*/
}
bool IsNYonDST( datetime whenNY){
// Market opens Sunday 6PM ET (NY local time) and closes Friday 4PM ET.// DST changes at 2AM Sunday, when the market is closed. I don't have to// worry about the passed time here, only the date.int year = TimeYear ( whenNY); #define MARCH 3int mon = TimeMonth ( whenNY); #define APRIL 4int dom = TimeDay ( whenNY); #define OCTOBER 10int dow = TimeDayOfWeek (whenNY); #define NOVEMBER 11// http://en.wikipedia.org/wiki/Daylight_saving_time_in_the_United_States// #History_of_DST_in_the_United_States// 1986-2006 DST the first Sunday in April to the last Sunday in October// 2007 on second Sunday March first Sunday in Novemberif (year < 2007 ){ int monBeg=APRIL, secndSun= 0 , monEnd=OCTOBER; }
else { monBeg=MARCH; secndSun= 7 ; monEnd=NOVEMBER; }
if (mon < monBeg ) return (false); // Early spring.if ( mon > monEnd) return (false); // Late fall.if (mon != monBeg){ if (mon != monEnd) return (true); // Summer.if (year < 2007 ){ // Find last Sun = dom - (dow-SUNDAY) but SUNDAY==0for ( int lastSun = dom-dow; lastSun+ 7 <= 31 ; lastSun += 7 ){}
return (dom < lastSun); // DST Before Sun. &
} } // not on markt open// Otherwise first or second Sunday of MonBegin or first Sunday of MonEndfor ( int firstSun = dom + 7 -dow; firstSun > 7 ; firstSun--){}
if (mon == monBeg) return (firstSun+secndSun <= dom); // DST On/Afterreturn (dom < firstSun); // DST Before Sun.
}
// Otherwise first or second Sunday of MonBegin or first Sunday of MonEnd// for (int firstSun = dom + 7-dow; firstSun > 7; firstSun--){}for ( int firstSun = dom + 7 -dow; firstSun > 7 ; firstSun -= 7 ){}
Bunlar iyi noktalar, MT4 işlevlerinde bile her zaman doğru değeri döndürmeyen tahmin niteliğinde olan daha birçok şey var. Örneğin, komisyoncu ve sunucu bilgileri ve değişken spread, ECN veya değil, SL gerekli veya değil gibi ticaret parametreleri, yalnızca hata işleme, sembol bilgileri vb.
Bunların çoğu, kolayca kontrol edilemeyen (ve kontrol edilmesi gereken) basit temel şeylerdir. Örneğin, açık grafikler ve geçmiş verileri hakkında bilgi, zaman bilgisi (GMT, saat dilimi, DST gibi), piyasa açılışı, kapanış bilgisi.
Olağanüstü Durum Kurtarma gerçekten iyi olurdu, MT4'ün istediği gibi kapanmaması ve yeniden başlatılması (güncelleme), ayrıca terminalin kapanmasından saatler sonra bile görev yöneticisinde donmuş kalan terminal.exe düzgün kapanması (ve kapalı olduğu düşünülüyor) herhangi bir hata mesajı olmadan kapat düğmesiyle düzgün şekilde).
Bir tür yerel veri merkezi desteği de iyi olurdu, sınırlı global değişkenler ve açılan dosyalar yerine çalışmayı kolaylaştırırdı. Eksik olan talep, teklif, (yayılma) onay verilerinin depolanmasından bahsetmiyorum bile.
Birlikte hayatı daha da zorlaştıran birçok basit eksik şey var ve mümkünse bunları doğru bir şekilde halletmek için korkunç miktarda iştir. Kapsamlı düzgün çalışma için birçok harici ipucu ve püf noktası, hatta hack'ler gereklidir. Kod tabanında bir strateji yayınlayan ve MT4 veya sunucuyla ilgili tüm olası (çoğu aracıya özgü) sorunları çözmeyen hiç kimseyi suçlamıyorum - özellikle de nokta hata işlemede değil stratejideyse.
Çok basit şeyler bile eksiktir, bir şeyler gerçekten ters gittiğinde kolayca yüzlerce megabayt veya daha fazla büyüyebilen günlük dosyalarıyla ilgilenemiyoruz. Disk dolana kadar büyürler ve hiçbir şey yapılamaz, hatta günlük dosyası işlemede terminal ayarlarında bir seçenek bile yoktur.
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
İşte benim eksi gerçek ticaret mantığı.
Ve RaptorUK'un yorumu için yaptığım düzeltme:
Çoklu çizgi kodunu bindirmelere izin verecek şekilde değiştirdim, ..
TLne Geriye dönük uyumlu:
Alt çizelge üzerinde çizim yapmak için sadece iWin = WindowFind("indicatorName"); işlevini kullanın.
Hem ana çizelgede hem de alt çizelgede gösterge çizimiyle ilgili bir gönderiden, TLine değişikliklerle her ikisi için de kullanılabilir.
Alt çizelge üzerinde çizim yapmak için sadece iWin = WindowFind("indicatorName"); işlevini kullanın.
teşekkürler
Piyasa kapanış zamanı.
SL'yi geçerek hafta sonundaki pazar boşluğunun zarar görmesini önlemek için tüm siparişleri hafta sonundan önce kapatmak istedim (piyasa Cuma günü kapanır). (Bu, test cihazında modellenmemiştir.)
Yani soru şu ki, piyasa ne zaman kapanıyor (veya açılıyor)? İnternetteki tüm ilanlar ve aramalar tamamen yanlış. Forex Eğitiminden - Forex'e Giriş - IBFX Forex piyasası haftanın 5.5 günü, günde 24 saat çalışır (Pazar günü 18:00 ET'den Cuma 16:00 ET'ye kadar) Bu, ET - New York yerel saatidir.
Bu, DST sınırları yıldan yıla değiştiğinden, Tüm kayıtların ne zaman yapıldığına bağlı olduğu anlamına gelir.
Bu, söz konusu çubuk için NY DST'nin ne zaman başlayıp bittiğini hesaplamanın gerekli olduğu anlamına gelir. (Geriye dönük testler için en azından 2000 değerlerine ihtiyacımız var.) Sorun şu ki, Windows mevcut TZ ve UTC arasında ve yalnızca mevcut yıl için dönüştürme rutinleri sağlamaz. PC ET'de değilse, doğrudan yapılamaz. Dahası, Windows8 çıkana kadar ET ve önceki yıllar için dönüşüm alamazsınız. Ve Win7'deki Kayıt Defterine baktığımda, değerler sadece 2005'i kapsıyor (ve eğer doğru okursam bunlar yanlıştı.) Yani Win8'in daha iyi olacağına bahse girmiyorum.
Bu, DST'yi kendim hesaplamam gerektiği anlamına gelir. Kodumu güncelledim: TimeGmt() ve LocalTimeGMT() varsayılan argümanlar, bazı ek belgeler ve kontrollerle ve piyasa kapanış zamanını hesaplamak için kod yazdım. Zevk almak.
Bunlar iyi noktalar, MT4 işlevlerinde bile her zaman doğru değeri döndürmeyen tahmin niteliğinde olan daha birçok şey var. Örneğin, komisyoncu ve sunucu bilgileri ve değişken spread, ECN veya değil, SL gerekli veya değil gibi ticaret parametreleri, yalnızca hata işleme, sembol bilgileri vb.
Bunların çoğu, kolayca kontrol edilemeyen (ve kontrol edilmesi gereken) basit temel şeylerdir. Örneğin, açık grafikler ve geçmiş verileri hakkında bilgi, zaman bilgisi (GMT, saat dilimi, DST gibi), piyasa açılışı, kapanış bilgisi.
Olağanüstü Durum Kurtarma gerçekten iyi olurdu, MT4'ün istediği gibi kapanmaması ve yeniden başlatılması (güncelleme), ayrıca terminalin kapanmasından saatler sonra bile görev yöneticisinde donmuş kalan terminal.exe düzgün kapanması (ve kapalı olduğu düşünülüyor) herhangi bir hata mesajı olmadan kapat düğmesiyle düzgün şekilde).
Bir tür yerel veri merkezi desteği de iyi olurdu, sınırlı global değişkenler ve açılan dosyalar yerine çalışmayı kolaylaştırırdı. Eksik olan talep, teklif, (yayılma) onay verilerinin depolanmasından bahsetmiyorum bile.
Birlikte hayatı daha da zorlaştıran birçok basit eksik şey var ve mümkünse bunları doğru bir şekilde halletmek için korkunç miktarda iştir. Kapsamlı düzgün çalışma için birçok harici ipucu ve püf noktası, hatta hack'ler gereklidir. Kod tabanında bir strateji yayınlayan ve MT4 veya sunucuyla ilgili tüm olası (çoğu aracıya özgü) sorunları çözmeyen hiç kimseyi suçlamıyorum - özellikle de nokta hata işlemede değil stratejideyse.
Çok basit şeyler bile eksiktir, bir şeyler gerçekten ters gittiğinde kolayca yüzlerce megabayt veya daha fazla büyüyebilen günlük dosyalarıyla ilgilenemiyoruz. Disk dolana kadar büyürler ve hiçbir şey yapılamaz, hatta günlük dosyası işlemede terminal ayarlarında bir seçenek bile yoktur.