Semalam, Saya menulis sedikit tentang bagaimana backtester menyerupai mata. When NinjaTrader encounters a bar where the stop and take profit fall within the bar’s range, ia sentiasa menganggap bahawa berhenti dilanda pertama.
Saya isu ini datang untuk pelanggan yang mahu menjual strategi untuk klien institusi. Institusi itu mahu keupayaan untuk backtest untuk memahami bagaimana strategi yang melakukan dalam keadaan pasaran yang lebih luas. Keputusan hidup hanya meliputi 9 bulan, yang menyukarkan pelabur untuk membuat keputusan yang betul. A dipercayai, backtest tepat akan membolehkan pelanggan saya untuk memudahkan jualan.
Apabila kita mula-mula diprogramkan strategi, ia kelihatan seperti kegagalan yg berkeras. Keputusan menunjukkan 45 ijazah terjun ekuiti dari setiap perdagangan. Dia meletakkan di perhentian 1/3 daripada ATR, jadi secara semula jadi, NinjaTrader diandaikan bahawa mereka dilanda sepanjang masa.
Penyelesaian yang kami dibangunkan baginya menggunakan tinggi tempoh masa carta bahawa strategi yang sebenarnya digunakan, tetapi kita kemudiannya diubah suai kod untuk dilakukan termasuk apa panggilan NinjaTrader intrabar butiran. Pada asasnya, kami menambah carta tick pada hujung belakang yang memaksa strategi untuk mengemas kini pada tick tick oleh asas.
It’s actually pretty simple to program. Dalam fungsi Memula yang, anda perlu menambah tawaran dan meminta carta tick.
langkau dilindungi Memula tidak sah()
{
Tambah(rentetan instrumentName, PeriodType.Tick, 1, MarketDataType.Bid);
Tambah(rentetan instrumentName, PeriodType.Tick, 1, MarketDataType.Ask);
}
Kemudian, dalam OnBarUpdate yang() fungsi, anda letakkan kod yang tidak berubah. Semua yang anda perlu lakukan adalah untuk meletakkan ia dalam yang mudah jika-maka Pernyataan manakah
langkau dilindungi OnBarUpdate tidak sah()
{
jika( BarsInProgress == 0 )
{
// Melakukan barangan
}
}
Keputusan backtest datang dalam $5 keputusan perdagangan sebenar dalam tempoh 9 bulan! Walaupun ujian tersokong sering membawa kepada keputusan yang tidak tepat, kami teruja untuk mengeluarkan semula hasil yang dengan apa-apa kesilapan kecil.
Kelemahan utama kaedah ini adalah bahawa anda secara manual mesti menaip nama instrumen bahagian dalam kod sumber, kemudian menyusun ia, setiap kali anda ingin menjalankan backtest pada instrumen baru. It’s not a great solution, tetapi NT7 malangnya tidak menyokong pengaturcaraan memanggil InstrumentName dari dalam Memula().
STRATEGIK berkata
Hello – Saya akan uji ini terima kasih. Saya telah menggunakan hanya
langkau dilindungi Memula tidak sah()
{
Tambah(PeriodType.Tick, 1);
}
dan kemudian sama seperti anda dengan
langkau dilindungi OnBarUpdate tidak sah()
{
jika( BarsInProgress == 0 )
{
// Melakukan barangan
}
…….but now I’m wondering how to add in the instrument name? Adakah ia di dalam panduan bantuan? Jika tidak, anda dapat menghantar dengan contoh salah satu kontrak semasa?
Terima kasih!
Shaun Overton berkata
Hi Gav,
Terima kasih untuk komen anda. You must add the instrument name manually since it’s not programmatically accessible in Initialize().
Tambah(rentetan instrumentName, PeriodType periodType, tempoh Int)
http://www.ninjatrader.com/support/helpGuides/nt7/add3.htm
STRATEGIK berkata
Hi Shaun,
Terima kasih saya pula sehingga satu menu malam tadi dan digunakan perkara-perkara berikut.
Tambah(“TF 09-11”, PeriodType.Tick, 1, MarketDataType.Ask);
Tambah(“TF 09-11”, PeriodType.Tick, 1, MarketDataType.Bid);
Tambah(“TF 09-11”, PeriodType.Tick, 1, MarketDataType.Last);
Jadi saya telah meminta, membida dan bertahan pada bar tambahan dijalankan juga. Jadi aku di dataseries utama (BIP 0) jangka masa yang lebih tinggi dan kemudian orang-orang tambahan seperti di atas. Backtest kelihatan lebih baik, Terima kasih kerana posting penemuan anda. Saya kemudiannya terserempak dengan kod yang sama di forum NT tetapi melihat di Salam pertama.
Terima kasih,
G.D.
Shaun Overton berkata
I’m glad that you found it useful. Forum yang kadang-kadang sukar untuk mengemudi. Ia mengambil masa sementara untuk belajar di mana untuk mencari maklumat yang anda perlukan.
Marty berkata
Terima kasih atas bantuan yang. Hanya apa yang saya Cari! 🙂
Shaun Overton berkata
You’re welcome. I’m glad that you found the post useful.
SEB berkata
Hello Shaun,
Anda menyebut bahawa anda perlu untuk kod nama instrumen keras setiap kali anda ingin mencuba satu lagi inisiatif. I had an issue recently where my stock was not available to short and I had to modify my strategies so that I can still use the signal from my primary instrument but created an input variable to trade another stock if required without having to recompile.
It`s pretty straightforward, here’s the code:
public class ABC : Strategi
{
#region Variables
private string stockToTrade = @”PERISIK”; // Let’s assume you usually trade SPY.
(…)
#endregion
langkau dilindungi Memula tidak sah()
{
(…)
Tambah(stockToTrade, PeriodType.Minute, 5);
}
langkau dilindungi OnBarUpdate tidak sah()
{
(…)
}
#region Properties
[Description(“”)]
[GridCategory(“Parameter”)]
public string StockToTrade
{
get { return stockToTrade; }
set { stockToTrade = value; } // You’ll be able to select another instrument if you want
}
#endregion
}
I hope this is useful.
daszilagyi berkata
Hi
and what if you call the multi timeframe like this?
Tambah(this.Instrument.MasterInstrument.Name, PeriodType.Tick, 1, MarketDataType.Bid);
Tambah(this.Instrument.MasterInstrument.Name, PeriodType.Tick, 1, MarketDataType.Ask);
I think in this way you dont have to type the names manually.
Shaun Overton berkata
Bahawa kerja-kerja, terlalu!
Aaron Soderstrom berkata
Adakah kerja ini masih? Saya kawanan backtest tentera sekarang ninjatrader untuk menutup.
Sorakan,
Aaron Soderstrom
Shaun Overton berkata
Ya, Ia masih berfungsi.
Mark berkata
Bagaimana anda boleh masukkan pesanan dalam contoh ini? EnterLong dan SetStopLoss? Saya tidak dapat mengeluarkan keputusan anda diterangkan dengan fungsi-fungsi.
Contoh dari Ninja menghantar pesanan kepada kedua siri bar. Adalah bahawa apa yang anda lakukan?(http://www.ninjatrader.com/support/forum/showthread.php?t=6652)
Shaun Overton berkata
Kaedah yang digunakan untuk memasuki perdagangan yang tidak akan menjejaskan pelaksanaan. Anda perlu menghantar pesanan dalam siri kedua (iaitu, tidak dalam aliran tandakan).
Mark berkata
Terima kasih untuk apa-apa balasan cepat. I’m still a little unclear.
Anda sebutkan dalam artikel anda meninggalkan kod di dalam OnBarUpdate() tidak berubah. Jika kod yang berjalan pada carta harian berikut:
jika (Tutup[0] > EMA(20))
{
Masukkan Long(); SetStopLoss(); SetProfitTarget();
}
Adakah apa yang anda lakukan adalah menambah siri tandakan ask dan bid (dan meletakkan kod logik dalam jika (BarsInProgress == 0))?
Shaun Overton berkata
Betul-betul.
Mark berkata
I guess I’m missing something. That doesn’t change the results that I get. Reading on the ninja forum, they mention that SetStopLoss will refer to the primary time series. I tried sending an exit order using ExitLongStop and ExitLongLimit to the BarsInProgress = 1 (Bid tick series) to exit. This changed the results.
Not sure what the difference would be but thanks for your replies.
Shaun Overton berkata
The two obvious problems would be:
1) Have you downloaded tick data in NinjaTrader?
2) Did you change the price type from Last in the backtest settings?
Mark berkata
Yes I have tick data, bid and ask. The primary series is 1 Day Bid data.
darren berkata
When I do this I get a “You must use the overload that has a ‘Bars In Progress’ parameter when calling the BarsSinceEntry() method in the context of a multi-time frame and instrument strategy. Ada sebarang idea bagaimana untuk membaikinya?
Shaun Overton berkata
Adakah anda menggunakan BarsInProgress sekali?