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();
// #gerekli bitti
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();
// gerekli başla
bool Bayrak = false;
bool sonuc = false;
lock (locker)
{
sayac++;
Bayrak = sayac == TotalExplorerCount;
// tarama koşulu başla
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;
}
// # tarama koşulu bitti
}
if (Bayrak && liste.Length>0)
{
// telegram bağlan;
}
return sonuc;
// #gerekli bitti
}
}
}
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ış";
}
// Taramadaki sembol, sembol listesinde var mı yok mu?
var kontrol = SembolListesi.FirstOrDefault(x => x.Sembol == taramaListesi.Sembol);
// Taramadaki sembole daha önce emir gönderildi mi?
var DahaOnceEmirGonderildiMi = Gerceklesenler.FirstOrDefault(x => x.Sembol == taramaListesi.Sembol);
// Daha önce emir gönderilmediği için listeye direkt eklenecek
if (DahaOnceEmirGonderildiMi == null && kontrol != null)
{
emirVerisinMi = true;
Siparis Siparis = new Siparis();
Siparis.Sembol = taramaListesi.Sembol;
Siparis.EmirYonu = taramaListesi.EmirYonu;
Siparis.Adet = kontrol.Adet;
//Siparis.Tarih = Convert.ToDateTime(symbol.Split(':')[3].Trim());
Gerceklesenler.Add(Siparis);
// Daha önce emir gönderildiği için ilgili satırı düzenlenecek
}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());
// Siparis.Tarih = Convert.ToDateTime(symbol.Split(':')[3].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;
}
// Dosya oku
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);
}
// Dosyaya yaz
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