Merhabalar,
Yaptığınız tarama sonucuna göre algoritma çalıştırabilirsiniz.
Fakat bu biraz uzun bir işlem. Elimden geldiğince en sade hali ile anlatmaya çalışıp örnekleri paylaşacağım.
Önce tarama kodunu yazmanız gerekiyor. Bunun için hazır bir şablon var o şablonu kullanmalısınız.
(Explorer Sihirbazı üzerinden yazdığınız taramalar üzerinden direkt olarak emir gönderimi yapmanız mümkün değildir. Tarama kodu içerisinde de değişikliğe ihtiyaç vardır.)
Daha sonra bu taramayla entegre olarak yazılan bir strateji olacak. (Bununda şablonu mevcut o şablonu da paylaşacağım)
Stratejiyi de eş zamanlı çalıştıracaksınız. Böylelikle tarama ile çıkan sonuçlar stratejiye yönlendirilecek, al sat işlemi olacak.
Şimdi uygulamanız gereken adımları anlatıyorum çünkü sadece yukarıdaki anlatılanla bitmiyor :)
Önce taramayı çalıştırıyorsunuz ve kodunuz hisseleri taramayı başlıyor.
Daha sonra C klasörünüzde IQ Data diye bir klasör oluşuyor, bu klasörde de çalıştırdığınız taramanın adı yazıyor.
Bu klasöre tıkladığınızda içerisinde boş bir şekilde Sembol Listesi adında bir metin belgesi vardır.
Bu metin belgesinin içerisine hangi sembolleri alıp satmak istiyorsanız Sembol İsmi ve Sembol adedi şeklinde ekleme yapıyorsunuz. (Kopyala Yapıştır yolu ile yapabilirsiniz.) (Bunun sebebi stratejiniz bu metin belgesinden sembolleri çekiyor ve al/sat yapıyor.) -Sembol listesinin de hazır hali var, onu da paylaşacağım-
Daha sonra stratejiyi de çalıştırıyorsunuz ve sistem al sat yapmaya başlıyor.
Explorer Kodu:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Indicators;
using System.IO;
namespace Matriks.Lean.Algotrader
{
public class ExpMatic : Explorer
{
[Parameter(14)]
public int DiPeriod1;
[Parameter(14)]
public int VortexPeriod1;
DI di;
VORTEX vortex;
public static int sayac = 0;
public static string liste = "";
static object locker = new object();
public override void OnInit()
{
di = DIIndicator(Symbol, SymbolPeriod, OHLCType.Close, DiPeriod1);
vortex = VortexIndicator(Symbol, SymbolPeriod, OHLCType.Close, VortexPeriod1);
}
public override bool OnExplorer(List<BarDataEventArgs> bardatas)
{
var barDataModel = GetBarData();
bool Bayrak = false;
bool sonuc = false;
lock (locker)
{
sayac++;
Bayrak = sayac == TotalExplorerCount;
if (CrossAbove(di, di, 0, 1) && CrossAbove(vortex, vortex, 0, 1))
{
liste += Symbol + ":";
liste += OrderSide.Buy.ToString() + ",";
sonuc = true;
}else if (vortex.Value[0][vortex.CurrentIndex] <= vortex.Value[1][vortex.CurrentIndex] && di.Value[0][di.CurrentIndex] <= di.Value[1][di.CurrentIndex])
{
liste += Symbol + ":";
liste += OrderSide.Sell.ToString() + ",";
sonuc = true;
}
}
if (Bayrak && liste.Length>0)
{
}
return sonuc;
}
}
}
Strateji Kodu:
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using System.Windows.Media;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using System.IO;
namespace Matriks.Lean.Algotrader
{
public class ExpMaticStr : MatriksAlgo
{
[Parameter(true)]
public bool SembollereEmirlerSiraliMiGonderilsin;
[Parameter(5)]
public int TaranmaSuresi;
[Parameter("ExpMatic")]
public string AnaDizin;
public string PathMain = "C:\\IQData\\";
public string PathLogs = "C:\\IQData\\";
public string DosyaAdiSembolListesi = "SembolListesi";
public string DosyaAdiTaramaListesi = "TaramaListesi";
public string DosyaAdiGerceklesenler = "Gerceklesenler";
public string veriTaramaListesi, veriSembolListesi, veriGerceklesenler;
public class Siparis
{
public string Sembol;
public string EmirYonu;
public decimal Adet;
public DateTime Tarih;
}
public static List<Siparis> TaramaListesi = new List<Siparis>();
public static List<Siparis> SembolListesi = new List<Siparis>();
public static List<Siparis> Gerceklesenler = new List<Siparis>();
string th = "Kripex-" + DateTime.Now.ToShortDateString();
public override void OnInit()
{
SetTimerInterval(TaranmaSuresi);
PathMain += AnaDizin;
PathLogs += AnaDizin + "\\Logs";
}
public override void OnInitComplated()
{
SembolListesiniGetir();
}
bool emirVerisinMi = false;
[Output]
public string NeZamanTetiklendi;
public override void OnTimer()
{
try
{
NeZamanTetiklendi = DateTime.Now.ToString();
string veri = "", _veriGerceklesenler = "", _emirYonu;
TaramaListesi.Clear();
Gerceklesenler.Clear();
TaramaListesiniGetir();
GerceklesenleriGetir();
if (veriTaramaListesi.Length>0)
{
foreach (Siparis taramaListesi in TaramaListesi)
{
if (taramaListesi.EmirYonu == OrderSide.Buy.ToString())
{
_emirYonu = "alış";
}else
{
_emirYonu = "şatış";
}
var kontrol = SembolListesi.FirstOrDefault(x => x.Sembol == taramaListesi.Sembol);
var DahaOnceEmirGonderildiMi = Gerceklesenler.FirstOrDefault(x => x.Sembol == taramaListesi.Sembol);
if (DahaOnceEmirGonderildiMi == null && kontrol != null)
{
emirVerisinMi = true;
Siparis Siparis = new Siparis();
Siparis.Sembol = taramaListesi.Sembol;
Siparis.EmirYonu = taramaListesi.EmirYonu;
Siparis.Adet = kontrol.Adet;
Gerceklesenler.Add(Siparis);
}else
{
var kontrolSira = Gerceklesenler.FirstOrDefault(x => x.Sembol == taramaListesi.Sembol && x.EmirYonu != taramaListesi.EmirYonu);
if (SembollereEmirlerSiraliMiGonderilsin)
{
if (kontrolSira != null)
{
emirVerisinMi = true;
kontrolSira.EmirYonu = taramaListesi.EmirYonu;
}else
{
emirVerisinMi = false;
}
}else if (DahaOnceEmirGonderildiMi != null)
{
emirVerisinMi = true;
DahaOnceEmirGonderildiMi.EmirYonu = taramaListesi.EmirYonu;
}
}
if (kontrol != null && emirVerisinMi)
{
Debug(kontrol.Sembol + " sembolinden " + kontrol.Adet + " adet " + _emirYonu + " emir gönderildi.");
SendMarketOrder(kontrol.Sembol, kontrol.Adet, (OrderSide) Enum.Parse(typeof (OrderSide), taramaListesi.EmirYonu));
veri += kontrol.Sembol + ":" + taramaListesi.EmirYonu + ":" + kontrol.Adet + ":" + DateTime.Now + ",";
}else if (kontrol == null)
{
Debug(taramaListesi.Sembol + "- bu sembol sembol listenizde bulunmamakta. emir göndermek için eklemelisiniz.");
}
else
{
Debug(taramaListesi.Sembol + " - Emir sinyali geldi fakat emirlerin sıralı gitmesi seçeneği aktif olduğundan emir gönderilmedi");
}
}
foreach (var sym in Gerceklesenler)
{
_veriGerceklesenler += sym.Sembol + ":" + sym.EmirYonu + ":" + sym.Adet + ":" + sym.Tarih + ",";
}
DosyayaYaz(PathMain, DosyaAdiGerceklesenler, _veriGerceklesenler, false);
DosyayaYaz(PathLogs, th, veri, true);
DosyayaYaz(PathMain, DosyaAdiTaramaListesi, "", false);
Debug("Tarama dosyası temizlendi.");
}
}catch (Exception e)
{
Debug(e.ToString());
}
}
public void TaramaListesiniGetir()
{
veriTaramaListesi = DosyadanOku(PathMain, DosyaAdiTaramaListesi);
veriTaramaListesi = veriTaramaListesi.Trim();
if (veriTaramaListesi.Length>0)
{
string[] _symbols = veriTaramaListesi.Substring(0, veriTaramaListesi.Length - 1).Split(',');
foreach (var symbol in _symbols)
{
Siparis Siparis = new Siparis();
Siparis.Sembol = symbol.Split(':')[0];
Siparis.EmirYonu = symbol.Split(':')[1];
Siparis.Adet = 0;
Siparis.Tarih = DateTime.Now;
TaramaListesi.Add(Siparis);
}
}
}
public void GerceklesenleriGetir()
{
veriGerceklesenler = DosyadanOku(PathMain, DosyaAdiGerceklesenler);
veriGerceklesenler = veriGerceklesenler.Trim();
if (veriGerceklesenler.Length>0)
{
string[] _symbols = veriGerceklesenler.Substring(0, veriGerceklesenler.Length - 1).Split(',');
foreach (var symbol in _symbols)
{
Siparis Siparis = new Siparis();
Siparis.Sembol = symbol.Split(':')[0].Trim();
Siparis.EmirYonu = symbol.Split(':')[1].Trim();
Siparis.Adet = Convert.ToDecimal(symbol.Split(':')[2].Trim());
Gerceklesenler.Add(Siparis);
}
}
}
public void SembolListesiniGetir()
{
veriSembolListesi = DosyadanOku(PathMain, DosyaAdiSembolListesi);
veriSembolListesi = veriSembolListesi.Trim();
if (veriSembolListesi.Length>0)
{
string[] _symbols = veriSembolListesi.Substring(0, veriSembolListesi.Length - 1).Split(',');
foreach (var symbol in _symbols)
{
Siparis Siparis = new Siparis();
Siparis.Sembol = symbol.Split(':')[0].Trim();
Siparis.EmirYonu = "Buy";
Siparis.Adet = Convert.ToDecimal(symbol.Split(':')[1].Trim());
Siparis.Tarih = DateTime.Now;
SembolListesi.Add(Siparis);
}
}else
{
Debug("İstenilen formatta sembol listesini doldurunuz ve yeniden çalıştırınız");
}
}
public bool EmirVerisinMi()
{
return true;
}
public string DosyadanOku(string dosyayolu, string dosyaAdi)
{
if (!System.IO.Directory.Exists(dosyayolu))
Directory.CreateDirectory(dosyayolu);
string _fileName = Path.Combine(dosyayolu, dosyaAdi + ".txt");
if (!File.Exists(_fileName))
{
File.AppendAllText(_fileName, "");
}
return File.ReadAllText(_fileName);
}
public void DosyayaYaz(string dosyayolu, string dosyaAdi, string icerik, bool eklenecekMi)
{
if (!System.IO.Directory.Exists(dosyayolu))
Directory.CreateDirectory(dosyayolu);
string _fileName = Path.Combine(dosyayolu, dosyaAdi + ".txt");
if (!File.Exists(_fileName))
{
File.AppendAllText(_fileName, "");
}
if (eklenecekMi)
{
File.AppendAllText(_fileName, icerik);
}else
{
File.WriteAllText(_fileName, icerik);
}
}
}
}
Sembol Listesi :
ACSEL : 5 ,
ADEL : 5 ,
ADESE : 5 ,
AEFES : 5 ,
AFYON : 5 ,
AGHOL : 5 ,
AGYO : 5 ,
AKBNK : 5 ,
AKCNS : 5 ,
AKENR : 5 ,
AKFGY : 5 ,
AKGRT : 5 ,
AKMGY : 5 ,
AKSA : 5 ,
AKSEN : 5 ,
AKSGY : 5 ,
AKSUE : 5 ,
AKYHO : 5 ,
ALARK : 5 ,
ALBRK : 5 ,
ALBTSF1 : 5 ,
ALCAR : 5 ,
ALCTL : 5 ,
ALDUKF1 : 5 ,
ALGYO : 5 ,
ALKA : 5 ,
ALKIM : 5 ,
ALMAD : 5 ,
ALONEF1 : 5 ,
ANELE : 5 ,
ANHYT : 5 ,
ANSGR : 5 ,
APYVCF2 : 5 ,
ARCLK : 5 ,
ARDYZ : 5 ,
ARENA : 5 ,
ARMDA : 5 ,
ARSAN : 5 ,
ARTI : 5 ,
ASELS : 5 ,
ASUZU : 5 ,
ATAGY : 5 ,
ATEKS : 5 ,
ATL