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)

daszilagyi 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):
replay_1.jpg


Ekkor kapjuk meg a következő pop – up ablakot , ahol beállíthatjuk a letölteni kívánt instrumentumunkhoz tick adatokat.
replay_2.jpg

É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

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:
x_2.bmp

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 

A sorozat első tagjaként kezdetnek egy egyszerű programot mutatok be, ami segítségünkre lehet , ha értesülni szeretnénk különböző történésekről a Ninja Traderünkben.

Bizonyára többször történt olyan , hogy pl.: indikátorok adtak számunkra jelzést , segítettek döntéseket hozni kötésekkel kapcsolatban , és erről szerettünk volna valamiféle alertet, hangüzenetet kapni.
Erre segítségünkre lehet a System.Speech.dll mellyel tetszőleges üzenetet mondathatunk ki indikátorunkkal , vagy stratégiánkkal.

A Windows keresőjébe írjuk be hogy system.speach.dll . Fontos , hogy a dll-ünk , amire hivatkozni fogunk az indikátorunkban .net 3.5 , re vagy korábbira legyen fordítva , a 4.0 ás a Ninjatrader 7.10 –es verziójában sajnos nem támogatott.
A filunkat valószinűleg a  C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0 –mappában találjuk meg.
Ezt a file-t includoljuk a projektünkhöz:include.png

A példaprogram , amit mutatok az alapján ad jelet , ha a gyertya a Bollinger szalag felett vagy alatt zár:
1. lépés:  meghívjuk a using dirktíváknál a speech dll-ünket.
using System.Speech.Synthesis;

2.lépés: Az onBarUpdate modulban megírjuk a jelző programkódot

if(Historical == false && Close[0] > Bollinger(2, 20).Upper[0]){
//ha a gyertya a Bollinger szallag felett zár és nem hisztorikus adatokról van szó
                        using (SpeechSynthesizer beszed = new SpeechSynthesizer()) 
                                                          //meghívjuk a Windows beszéd objektumát
                        {
                             beszed.Speak("Up");                                                          //kimondatjuk vele a jelzésünket
                        }
                  }
                        if(Historical == false && Close[0] < Bollinger(2, 20).Lower[0]){
//ha a gyertya a Bollinger szallag alatt zár és nem hisztorikus adatokról van szó
                        using (SpeechSynthesizer beszed = new SpeechSynthesizer())
  //meghívjuk a Windows beszéd objektumát
                        {
                             beszed.Speak("Down");                                                  //kimondatjuk vele a jelzésünket
                        }
                       
                  }



3. lépés Program lefordítása , használata.

Remélem hasznos leírást sikerült nyújtanom azok számára , akik ilyesmiben gondolkoztak
_________________________________________________________________________

Update 2013. február 21.

Kicsit frissítettem / bonyolítottam ezen a hangértesítés modulon. A lényege , hogy ha magyarul szeretnénk valamit kimondatni a számítógépünkkel , akkor nem tudjuk használni a fent említett megoldást. De hát természetesen erre is van megoldás.
A google translaternek van egy olyan funkciója, hogy fel tudja olvasni a beírt szövegeket , akár magyarul is , ezt használjuk ki egy programmal.

#region voicer

      private     void voice(string szoveg)
          {    
     if(   voicee      == false ){return;}
           var text = szoveg;
           string[] rosszkarakterek =new string[5];
           rosszkarakterek[0]="_";
           rosszkarakterek[1]="-";
           rosszkarakterek[2]="?";
           rosszkarakterek[3]=".";
           rosszkarakterek[4]="#";
     for (int i=0 ;i<=4;i++)
    {text=text.Replace(rosszkarakterek[i],"");}  
            var url = "http://translate.google.com/translate_tts?tl=hu&q=" + text;
           using (var client = new WebClient())
           {try{
               client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1";
               client.DownloadFile(url, "temp.mp3");
               string FileName = "temp.mp3";                  
                long lejatszas = mciSendString("open \"" + FileName + "\" type mpegvideo alias MediaFile", null, 0, IntPtr.Zero);
               lejatszas = mciSendString("play " + FileName + " from 0", null, 0, IntPtr.Zero);
                      string playCommand = "Close MediaFile";
    mciSendString(playCommand, null, 0, IntPtr.Zero);
           }catch{Print("Hiba a voice modulban- Playing Error");}  
    }
        }
#endregion        


A program működési elve a következő: elküldi a google translaternek a program a szöveget, és az audióformátumre konvertálja. Az audiófile-t (temp.mp3) letöltjük  és windows media playerrel lejátszuk.


Bemutató videó:

Ü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.

süti beállítások módosítása