2013.03.05. 15:58
Hiányzó adatok ellenőrzése Ninjatrader adatsorokban
Előfordul , hogy Backtestelés közben észre vesszük , hogy különböző nagyságú lyukak vannak az adatsorunkban , ez számos kellemetlenséget okozhat , főleg ha sok terméken szeretnénk tesztelni.
Ezen a hibán próbálunk segíteni a következő programunkkal.:
A hisztorikus adatokat : c:\Users\userneve\Documents\NinjaTrader 7\db\ - mappában tárolja el a Ninajtrader. Számunka a db\minute\ mappa lesz érdekes , ugyanis ide mentődnek le a backtesteléshez szükséges adatok (Backtestelésnél érdemes a napos adatokat is perces adatokból kinyernünk : 1440 perc) . Amint megnézzük a mappában található fileokat láthatjuk , hogy naponként tárolódnak el a gyertyaadatok.
Szükségünk van egy programra , ami észreveszi a fileokat egy adott mappában és egymáshoz viszonyítva végigellenőrzi , hogy melyik két nap között van hiány a mappában található adatok között.
A program nagyjából így néz ki:
private void button1_Click(object sender, EventArgs e)
{ if (adatok.Text == "" || adatok.Text == null) { MessageBox.Show("Nem írtál be mappát hogy hol keressem!"); return; }
var Files = new DirectoryInfo(adat).GetFiles().OrderBy(f => f.Name).ToList();
DateTime datum = Convert.ToDateTime("1900-01-01"); ;
DateTime datumelozo=Convert.ToDateTime("1900-01-01");
string ev, ho, nap;
foreach (var item in Files) //for ciklus végigszalad a filokon
{
ev = Left(item.Name, 4);
ho = Mid(item.Name, 4, 2);
nap = Mid(item.Name, 6, 2);
try { datum = Convert.ToDateTime(ev + "-" + ho + "-" + nap);
}
catch { MessageBox.Show("A mappában van olyan adat ami nem Ninjatrader idő adat !!");return;}
if(datum != datumelozo.AddDays(1) && datumelozo != Convert.ToDateTime("1900-01-01") && datum.DayOfWeek != DayOfWeek.Sunday && datum.AddDays(-1).DayOfWeek != DayOfWeek.Sunday)
{
Listbox(Convert.ToString("Adathiba :" + datum));
}
datumelozo = datum;
}
}
Program nem foglalkozik a hétvégékkel , az ünnepnapokat hibaként fogja értékelni.
Egy rövid videót is készítettem a progi használatáról:
A programot letölthetjük innen (ha a vírusírtó jelezne valamit [mint pl a példavideóban is] , akkor a forrás alapján ellenőrizhető , hogy mit tartalmaz a kód (semmi kártékonyat)
2013.01.19. 21:27
Market Replay
A sorozat következő tagjaként a market replay adatok letöltéséről fogok néhány szót ejteni.
A megfelelő replay adatokon való tesztelés fontos lehet egy stratégia tesztelése során , ugyanis ezzel a módszerrel véleményem szerint pontosabb képet kaphatunk az általunk megírt robot működéséről, könnyebben kiderülhetnek rejtett hibái.
Market Replay adatokhoz a következő módon juthatunk(File-Utilities- Download Replay Data):
Ekkor kapjuk meg a következő pop – up ablakot , ahol beállíthatjuk a letölteni kívánt instrumentumunkhoz tick adatokat.
És Itt jön a fő ok amiért fontosnak tartottam a cikk megírását: Mint ahogy a fenti képen láthatjuk sajnos csak 1 napra visszamenőleg tudjuk letölteni az adatokat. Ha 1 , netalán 2 hónapra akarjuk futtatni a tesztet ez jelentős számú kattintásunkba fog kerülni , ugyanis minden letöltés után az ablak bezáródik.
De a kattintásainkat szerencsére automatizálhatjuk egy egyszerű parancssoros C# program segítségével , ami a billentyűkombók lenyomásával letölti / végigklikkeli a hőn áhított letöltéseket.
static void replay()
{
DateTime StartDate = new DateTime();
DateTime EndDate = new DateTime();
string instrumentum;
try{
Console.WriteLine("Ird be hogy mikortól töltsük le");
StartDate = Convert.ToDateTime(Console.ReadLine());
}
catch { Console.WriteLine("Hiba a tól dátumban"); return; }
try
{
Console.WriteLine("Ird be hogy meddig töltsük le");
EndDate = Convert.ToDateTime(Console.ReadLine());
}
catch { Console.WriteLine("Hiba az ig dátumban"); return; }
if (StartDate == null || StartDate < Convert.ToDateTime("1800.01.01")) { Console.WriteLine("Nem írtál be tól dátumot");return; }
if (EndDate == null || EndDate < Convert.ToDateTime("1800.01.01")) { Console.WriteLine("Nem írtál be tól dátumot"); return; }
try
{
Console.WriteLine("instrumentum kezdőbetűje");
instrumentum = Console.ReadLine();
}
catch { Console.WriteLine("HIBA"); return; }
int DayInterval = 1;
List<DateTime> dateList = new List<DateTime>();
while (StartDate <= EndDate)
{
if (StartDate.DayOfWeek != DayOfWeek.Saturday || StartDate.DayOfWeek != DayOfWeek.Sunday)
{
//SetForegroundWindow(hWnd);
SendKeys.SendWait("%f"); //filemenu
SendKeys.SendWait("u"); //utilities
SendKeys.SendWait("d"); //download replay data
SendKeys.SendWait("{TAB}"); //default
SendKeys.SendWait(instrumentum); //istrumentum kezdőbetűje
SendKeys.SendWait("{TAB}");
SendKeys.SendWait(Convert.ToString(StartDate.Year)); //év
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait(Convert.ToString(StartDate.Month)); //hó
SendKeys.SendWait("{RIGHT}");
SendKeys.SendWait(Convert.ToString(StartDate.Day)); //nap
SendKeys.SendWait("{ENTER}");
Console.WriteLine("Ido : " + StartDate);
System.Threading.Thread.Sleep(100000);
SendKeys.SendWait("{ENTER}");
StartDate = StartDate.AddDays(DayInterval);
}
}
}
Használja mindenki egészséggel. A link amit kirakok ide tartalmazza a kódot annyival kibővítve , hogy aktiválja mindig a Control Center ablakot , ugyanis ha a háttérben van , vagy kisablakban lenn a tálcán a billentyűkombók nem működnének.
Az exe file-t itt találjátok: http://www.4shared.com/file/0A7XW-l7/ninjareplay.html
A forráskódfile-t pedig itt: http://www.4shared.com/file/-mSSbRA_/replay_downloader.html
2012.09.30. 12:20
Print Screen generator
Felmerülhet az igény, hogy szeretnék rögzíteni az aktuális chart tartalmát , és ezeket archiválva összegyűjtögetni valahol a számítógépen , esetleg egy sikeres üzletkötés adatait szeretnénk menteni későbbi elemzések érdekében. Sorozat második tagja ként egy erre a célra létrehozott indikátorban futó program megírását fogom leírni lépésről-lépésre.
Szükségünk lesz egy könnyen elérhető gombra , amit ha a charton megnyomunk a kép automatikus mentésre kerül.
A print screen készítésére a következő voidot fogjuk használni:
#region kepolvasas
void kep(string kep)
{
Form currentForm = Form.ActiveForm;
Graphics graph = null;
try
{
try { Bitmap bmp = new Bitmap(currentForm.Width, currentForm.Height);
graph = Graphics.FromImage(bmp); // bmp-ben ment graph.CopyFromScreen(currentForm.Bounds.Location.X, currentForm.Bounds.Location.Y, 0, 0, bmp.Size);
bmp.Save(kep);
}
catch{;}
}finally
{
}
}
#endregion
A void működése egyszerű , beolvas egy string típusú változót (ami később a file neve lesz ) , leméri az éppen aktív ablak méretét (jelen esetben a chartunkat) és lementi a megfelelő helyre bmp formátumban.
a void meghívása a következő:
screenshot(@"C:\Users\szilagyid\Documents\NinjaTrader 7\bin\Custom\x.bmp");
Ezek után csak egy gombot kell elhelyeznünk a charton , ami automatikusan meghívja majd a print screen készítőnket.
Definiáljunk hát változót a gombunknak a variable regionben.:
private ToolStrip toolStrip;
private ToolStripButton screenshot;
Ezeket a változókat meghívjuk az OnStartUp() eseményben , és állítsuk be a paramétereit is:
protected override void OnStartUp()
{
Control[] tsr = ChartControl.Controls.Find("tsrTool", false);
if(tsr != null)
{
toolStrip = (ToolStrip) tsr[0];
if(toolStrip != null)
{
screenshot = new ToolStripButton("screenshot");
screenshot.ForeColor = Color.Gainsboro;
screenshot.BackColor= Color.Green;
screenshot.Text = "screenshot";
screenshot.Click += screenshot_Click;
toolStrip.Items.Add(screenshot);
}
}
}
Mint fent láthatjuk a gomb lenyomásakor: a screenshot_click esemény fog lefutni. : ez a void fogja meghívni a screenshot utasításunkat. így:
public void screenshot_Click(object sender, EventArgs e)
{
kep(@"d:\Documents and Settings\xyz\Dokumentumok\NinjaTrader 7\tmp\x.bmp");
}
Elkerülendő továbbá, hogy a program minden frissítéskor egy új gombot helyezzen a chartra , úgyhogy az on termination eseményben érdemes törölnünk a meglévő gombjainkat. így :
protected override void OnTermination()
{
toolStrip.Items.Remove(screenshot);
screenshot = null;
base.OnTermination(); }
Az output kb. így fog kinézni:
A teljes kód:
#region Variables
int myInput0;
private ToolStrip toolStrip;
private ToolStripButton screenshot;
#endregion
protected override void Initialize()
{
Add(new Plot(Color.FromKnownColor(KnownColor.Orange), PlotStyle.Line, "Plot0"));
Overlay = true;
}
protected override void OnStartUp()
{
Control[] tsr = ChartControl.Controls.Find("tsrTool", false);
if(tsr != null)
{
toolStrip = (ToolStrip) tsr[0];
if(toolStrip != null)
{
//tweettextbox.Size.Height = Size.Height(10);
//tweettextbox.Size.Width = Size.Width(150);
screenshot = new ToolStripButton("screenshot");
screenshot.ForeColor = Color.Gainsboro;
screenshot.BackColor= Color.Green;
screenshot.Text = "screenshot";
screenshot.Click += screenshot_Click;
toolStrip.Items.Add(screenshot);
}
}
}
protected override void OnTermination()
{
toolStrip.Items.Remove(screenshot);
screenshot = null;
base.OnTermination();
}
/// <summary>
/// Called on each bar update event (incoming tick)
/// </summary>
protected override void OnBarUpdate()
{
//if (Historical != true){ScreenShot();}
// Plot0.Set(Close[0]);
}
public void screenshot_Click(object sender, EventArgs e)
{
kep(@"d:\Documents and Settings\daszilagyi\Dokumentumok\NinjaTrader 7\tmp\x.bmp");
}
#region kepolvasas
void kep(string kep)
{
Form currentForm = Form.ActiveForm;
Graphics graph = null;
try
{
try { Bitmap bmp = new Bitmap(currentForm.Width, currentForm.Height);
graph = Graphics.FromImage(bmp); // bmp-ben ment
graph.CopyFromScreen(currentForm.Bounds.Location.X, currentForm.Bounds.Location.Y, 0, 0, bmp.Size);
bmp.Save(kep);
}
catch{;}
}finally
{
}
}
#endregion
Az indikátor egy verzióját le le lehet tölteni itt
2012.06.17. 18:24
Nyitás - 2012-08-26
Üdvözlök minden látogatót az algotrader.blog.hu oldalon. Az oldal egy hiányt próbál kitölteni a hasonló tőzsderobot programozó siteok között és próbálok olyan cikkeket publikálni , ami számos egyedi megoldást kínál a tőzsderobotok üzemelésével/programozásával kapcsolatban.