VST化のプログラム
本日は、VST化のサンプルプログラムを紹介します。非常に簡単です。
まず、損切りと利食い((逆)指値)の幅が固定値になっているEAは、通常は、以下のように記述されていると思います。
外からパラメーターを変更できるように、extern という文字をつけて、(逆)指値の幅を指定し、SL,TPなどの任意の変数に置き換えてあります。「65」「45」というのは、それぞれ、「65pips」「45pips」という意味です。
そして、新規発注をするための OrderSend()関数の中へ、SL,TPという変数を代入することによって、(逆)指値が指定され、サーバーへ送信されます。
Point というのは、その通貨ペアの最小取引単位を返す予約変数で、たとえば、USD/JPY=83.25円 のように、下2桁表示のチャートなら、Point = 0.01 で、USD/JPY=83.257円 のように、下3桁表示のチャートなら、Point = 0.001を返します。ここで、わざわざ Point を掛けているのは、先ほどの外部パラメーターでは、「65pips」「45pips」というようにピップス単位で、(逆)指値の幅を指定しているのに対して、OrderSend() 関数の中の(逆)指値については、チャート上の表示単位(USD/JPYなら「円」)で指定しなければならないため、単位を補正しているだけです。めんどくさいという人は、はじめから全部「円」単位で指定すればよいわけで、その場合には以下のようになっていると思います。
さて、ここまでは、(逆)指値の幅を固定値にした通常のEAの説明でした。次に、標準偏差を利用して、これをVST化してみますが、いろんなやり方があるので、以下は、あくまでもサンプルだと思ってください。
まず、外部パラメーターとして、標準偏差の計算期間を SD_Periodという変数で宣言します。そして、(逆)指値幅の代わりに、SLR,TPRという倍率定数を指定します。
あとは、標準偏差を割り出す iStdDev() 関数を呼び出して、計算期間を SD_Period と指定して、割り出された標準偏差を SD という変数に置き換えて、
SL = SD*SLR
TP = SD*TPR
という具合に、標準偏差×倍率定数を算出し、その結果をそれぞれを、SL,TPとして(逆)指値幅とします。そして、最終的には、SLR,TPRという外部パラメーターを最適化することになります。
しかし、ここで注意することがあります。
たとえば、チャート上の表示単位が下2桁であるのに、SL,TPの値が下3桁であったりすると、送信エラーとなります。そこで、SL,TPの下3桁を四捨五入して、下2桁に丸める必要があります。このとき使用するのが、NormalizeDouble() 関数です。
たとえば、0.1234 を下4桁で四捨五入して下3桁に丸めたいときは、
NormalizeDouble( 0.1234,3); と記述します。すると、0.123 という数値が返されます。
同様に、0.567 を下3桁で四捨五入して下2桁に丸めたいときは、
NormalizeDouble( 0.567,2); と記述します。すると、0.57 という数値が返されます。
ところが、丸める桁数をいちいち数えるのもめんどうですし、数え間違えたりしないために、Digits という予約変数を使用すると便利です。たとえば、チャートが、「83.257円」のように下3桁表示の場合は、Digits は「3」を、また、「83.25円」のように下2桁表示の場合は、Digits は「2」を自動的に返してくれます。
したがって、0.567 を下3桁で四捨五入して下2桁に丸めたいときは、
NormalizeDouble( 0.567,2); とする代わりに、NormalizeDouble( 0.567,Digits); とすれば、0.57という数値を返してくれます。
結局、プログラムは以下のようになります。
なお、標準偏差の代わりにATRを使用したVST化のプログラムは以下のようになります。
このように、VST化のプログラムは非常に簡単で、普段プログラムをしない人でも、ちょっと頑張れば市販のEAを改造することくらいはできると思います。
しかし、
このVST化には、非常に危険な罠があります。もう気づいていらっしゃる方もみえるでしょう。
そうです。標準偏差やATRが極端に大きくなったときに、損切りの幅も大きく広がってしまい、想定外の損失を出してしまうという問題があります。
もちろん、損切りの幅にリミットを設定すればいいわけですが、それでは、せっかくVST化した意味が半減します。
次回は、この問題をもっとスマートに解決する方法を紹介します。
応援よろしくお願いします。
↓
にほんブログ村
まず、損切りと利食い((逆)指値)の幅が固定値になっているEAは、通常は、以下のように記述されていると思います。
外からパラメーターを変更できるように、extern という文字をつけて、(逆)指値の幅を指定し、SL,TPなどの任意の変数に置き換えてあります。「65」「45」というのは、それぞれ、「65pips」「45pips」という意味です。
そして、新規発注をするための OrderSend()関数の中へ、SL,TPという変数を代入することによって、(逆)指値が指定され、サーバーへ送信されます。
Point というのは、その通貨ペアの最小取引単位を返す予約変数で、たとえば、USD/JPY=83.25円 のように、下2桁表示のチャートなら、Point = 0.01 で、USD/JPY=83.257円 のように、下3桁表示のチャートなら、Point = 0.001を返します。ここで、わざわざ Point を掛けているのは、先ほどの外部パラメーターでは、「65pips」「45pips」というようにピップス単位で、(逆)指値の幅を指定しているのに対して、OrderSend() 関数の中の(逆)指値については、チャート上の表示単位(USD/JPYなら「円」)で指定しなければならないため、単位を補正しているだけです。めんどくさいという人は、はじめから全部「円」単位で指定すればよいわけで、その場合には以下のようになっていると思います。
さて、ここまでは、(逆)指値の幅を固定値にした通常のEAの説明でした。次に、標準偏差を利用して、これをVST化してみますが、いろんなやり方があるので、以下は、あくまでもサンプルだと思ってください。
まず、外部パラメーターとして、標準偏差の計算期間を SD_Periodという変数で宣言します。そして、(逆)指値幅の代わりに、SLR,TPRという倍率定数を指定します。
あとは、標準偏差を割り出す iStdDev() 関数を呼び出して、計算期間を SD_Period と指定して、割り出された標準偏差を SD という変数に置き換えて、
SL = SD*SLR
TP = SD*TPR
という具合に、標準偏差×倍率定数を算出し、その結果をそれぞれを、SL,TPとして(逆)指値幅とします。そして、最終的には、SLR,TPRという外部パラメーターを最適化することになります。
しかし、ここで注意することがあります。
たとえば、チャート上の表示単位が下2桁であるのに、SL,TPの値が下3桁であったりすると、送信エラーとなります。そこで、SL,TPの下3桁を四捨五入して、下2桁に丸める必要があります。このとき使用するのが、NormalizeDouble() 関数です。
たとえば、0.1234 を下4桁で四捨五入して下3桁に丸めたいときは、
NormalizeDouble( 0.1234,3); と記述します。すると、0.123 という数値が返されます。
同様に、0.567 を下3桁で四捨五入して下2桁に丸めたいときは、
NormalizeDouble( 0.567,2); と記述します。すると、0.57 という数値が返されます。
ところが、丸める桁数をいちいち数えるのもめんどうですし、数え間違えたりしないために、Digits という予約変数を使用すると便利です。たとえば、チャートが、「83.257円」のように下3桁表示の場合は、Digits は「3」を、また、「83.25円」のように下2桁表示の場合は、Digits は「2」を自動的に返してくれます。
したがって、0.567 を下3桁で四捨五入して下2桁に丸めたいときは、
NormalizeDouble( 0.567,2); とする代わりに、NormalizeDouble( 0.567,Digits); とすれば、0.57という数値を返してくれます。
結局、プログラムは以下のようになります。
なお、標準偏差の代わりにATRを使用したVST化のプログラムは以下のようになります。
このように、VST化のプログラムは非常に簡単で、普段プログラムをしない人でも、ちょっと頑張れば市販のEAを改造することくらいはできると思います。
しかし、
このVST化には、非常に危険な罠があります。もう気づいていらっしゃる方もみえるでしょう。
そうです。標準偏差やATRが極端に大きくなったときに、損切りの幅も大きく広がってしまい、想定外の損失を出してしまうという問題があります。
もちろん、損切りの幅にリミットを設定すればいいわけですが、それでは、せっかくVST化した意味が半減します。
次回は、この問題をもっとスマートに解決する方法を紹介します。
応援よろしくお願いします。
↓
にほんブログ村
by xchsshzo
| 2011-07-03 11:00
| メタトレーダー