2009/02/01
相手を確認することが重要です。
※この内容は、EAの販売を推奨するものではありません。
よく、EAの販売を否定する人たちが、上げる理由があります。
『販売すれば(多数の人が使えば)同時にそのポジションでオーダーが入り、値が崩れる。そうすれば、EAの性能が落ち、利益があげられなくなる。それよりも、本当に有能なEAなら自分でコツコツ稼いだ方がいい。だから有能なEAなんて売っていない。』
この考えは本当でしょうか?
『私は、必ずしもそうとは思いません。』(EAの販売を推奨するものではありません。)
まず、私たちは、誰と取引をしているか?という点です。
FX取引は、【株の取引】と違い、FX業者との【相対取引】です。
【相対取引】とは、市場を介さずに売買当事者間で売買する方法。
つまり、相手は、FX業者であって、市場ではない。
では、買値と売値は、FX業者が勝手に作っているのか?という点です。
それは違います。インターバンク市場の値を参考にFX業者が作っています。(金融庁の目があり、あまり酷い事はできないはずです。)
【1分足の範囲内で、細かく値を操作し1~2pips滑らせることは可能でしょうね。】
だから、FX業者によって多少値にばらつきがあるものの、ほぼ似たような値になっているのです。
『だったら、大量のオーダーを出しても、値が変わらない?(動かない?)』
決してそうだとは言えません。なぜならFX業者もインターバンク市場とのカバー取引をしているはずだからです。
『はず』と書いたのは、インターバンク市場との取引の際にもやはり手数料がかかります。USDJPYで1銭から2銭だそうです。
【相対取引】でスプレッド1の場合、カバー取引を行えば行うほど、手数料分の負債が生じます。
カバー取引数=BUY数-ASK数(買い注文と売り注文の差がカバー取引数になるはずです。)
例えば、1つのEAで値を動かすことができる条件とは、
『独裁的なEAが存在し、かつFX業者がカバー取引をした場合、しかも、通常時の安定した市場では、USDJPYを10pips動かすのに1000万通貨のオーダーが必要だと言われていますので、カバー取引量が、その程度になった場合に値を動かすことができる。』
と思われます。
単独EAでは、考えづらいと思いませんか?
私の考えは、否定的です。
それよりも、単独でカバー取引しなければならないEAは、FX業者から何らかの処置が課せられるでしょうね。
だから、有能なEAは、売っていない!という結論になるかもしれませんが・・・
賞味期限(一様に成績が良い期間)があるのであれば、販売して利益を得た方が得策かもしれません。(EAの販売を推奨する意味合いではありません。)
いろいろ書きましたが、『自分が誰と取引をしているのか?』その相手を知ることも重要な要因であることは、間違いありません。
2009/01/30
Mizutori_EAの説明(カスタムユーザー向け③)
先回な続きです。
【自作関数の書き方】
※自作関数が処理後に受け渡す形(今回はdouble)で宣言します。
※( )の前は、自作関数の名前、( )内部は、受け渡された物の形(今回は、int)とそれを格納する変数です。
※下記の場合、ポジション数をposに格納したlotSizeCalcという自作関数で,処理後に受け渡すものが、doubleの形であることを意味します。
◆ LOTサイズ計算 ◆
double lotSizeCalc(int pos)
{※ここから(※ここまで)がこの自作関数の範囲です。
int doru = 1;
double lotMM = 0;
int sizeND = 0;
double lotsize = MarketInfo(Symbol(),MODE_LOTSIZE);
【1ロットの単位(数量)をlotsizeに格納】
double maxlots = MarketInfo(Symbol(), MODE_MAXLOT);
【取引可能な最大Lot数をmaxlotsに格納】
double minlots = MarketInfo(Symbol(), MODE_MINLOT);
【取引可能な最少Lot数をminlotsに格納】
double accountFreeMargin = AccountFreeMargin();
【口座の余剰証拠金額をaccountFreeMarginに格納】
string Currency = AccountCurrency();
【口座預金の通貨名をCurrencyに格納】
if(Currency == "JPY") doru = 100;
【もし口座預金の通貨名が、JPYなら、doruに100を格納】
if(Currency =="USD") doru = 1;
【もし口座預金の通貨名が、USDなら、doruに1を格納】
※doruは、通貨ごとに違う単位を合わせるためのものです。
double lot =(accountFreeMargin*Leverage) / (doru*lotsize);
【(余剰証拠金×レバ)/(doru×ロットサイズ)をlotに格納】
if(minlots>=1){sizeND=0;}else{if(minlots>=0.1){sizeND=1;}else{if(minlots>=0.01){sizeND=2;}}}
【取引可能な最少Lot数により、小数点以下の適用範囲を決定する】
switch(pos)
【ナンピン回数により処理を分ける】
{
case 0: 【ナンピン回数0回の場合】
lotMM = NormalizeDouble(lot*Lotpos1,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break;【switch処理を抜け出す】
case 1: 【ナンピン回数1回の場合】
lotMM = NormalizeDouble(lot*Lotpos2,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 2: 【ナンピン回数2回の場合】
lotMM = NormalizeDouble(lot*Lotpos3,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 3: 【ナンピン回数3回の場合】
lotMM = NormalizeDouble(lot*Lotpos4,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
case 4: 【ナンピン回数4回の場合】
lotMM = NormalizeDouble(lot*Lotpos5,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
default: 【ナンピン回数その他の場合】
lotMM = NormalizeDouble(lot*Lotpos6,sizeND);
【ナンピン回数による倍率をlotに掛けて、最少Lot数単位で丸めた数値をlotMMに格納】
break; 【switch処理を抜け出す】
}
if (lotMM < minlots) lotMM = minlots;
【求められた数値が最少Lot未満なら、lotMMに最小値を格納】
if (lotMM > maxlots) lotMM = maxlots;
【求められた数値が最大Lotを超えていたら、lotMMに最大値を格納】
if (lotMM > MaxLots) lotMM = MaxLots;
【求められた数値が設定した最大Lotを超えていたら、lotMMに設定した最大値を格納】
return (lotMM);
【求められた数値を、doubleの形で、この関数を呼び出したところに、返します。】
}※ここまで(lotSizeCalc自作関数の終わり)
◆時間軸によるMaのshiftの変更◆
int MaShift_Custom(int NowHour)
【MaShift_Customと名前の自作関数で、int型の数値を返します。】
{※ここから
int MaShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaShift = EuTime_MaShift ;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) MaShift = UsTime_MaShift ;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) MaShift = AsTime_MaShift ;
}
【1日を3つの範囲に分けてその範囲ごとの変数を設定するための仕様です。】
return(MaShift);
【求められた数値を、int型で、この関数を呼び出したところに、返します。】
}※ここまで
◆時間軸によるMaLimitのshiftの変更◆
※以前は、必要性がありましたが、今はほとんど使われていないものです。
※上記とほぼ同じことをしているので説明を省略します。
int MaLimtShift_Custom(int NowHour)
{
int MaLimtShift = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E) MaLimtShift = EuTime_MaLimtShift;
if(NowHour>= UsTime_S && NowHour<= UsTime_E)MaLimtShift = UsTime_MaLimtShift;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E)MaLimtShift = AsTime_MaLimtShift;
}
return(MaLimtShift);
}
◆時間軸による、Xoxの変更◆
※上記とほぼ同じため説明を省略します。
double Xox_Custom(int NowHour)
{※ここから
double Xox = 0;
if(NowHour>= EuTime_S && NowHour<= EuTime_E)Xox = EuTime_Xox;
if(NowHour>= UsTime_S && NowHour<= UsTime_E) Xox = UsTime_Xox;
if(AsTime_S <= AsTime_E) {
if(NowHour>= AsTime_S && NowHour<= AsTime_E) Xox = AsTime_Xox;
} else {
if(NowHour>= AsTime_S || NowHour<= AsTime_E) Xox = AsTime_Xox;
}
return(Xox);
}※ここまで
◆ マジックナンバーの作成◆
※本来、EAごと、通貨ペアごと、時間軸ごとに、マジックナンバーを変更しなければなりません。
しかし、忘れやすいので、通貨ごと、時間軸ごとで、マジックナンバーを自動的に変更するようにしてあります。
ただし、別のEAと同時に使用する場合、邪魔になるかもしれません。(あくまでも、テスト用の参考ソースです。)
int MagicfromSymbol() {
【MagicfromSymbolという名前の自作関数で、int型の数値を返す】
int MagicNumber=0;
for (int i=0; i<5; i++) { 【5回繰り返します。】
MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);
【 MagicNumberを3倍し、通貨ペア名のi番目の文字コード番号を加えたものをMagicNumberに格納】
}
MagicNumber=MagicNumber*3+Period();
【MagicNumberを3倍し、時間軸を加えたものをMagicNumberに格納】
return(MagicNumber);
【求められた数値を、int型で、この関数を呼び出したところに、返す。】
}
◆TakeProfitの計算◆
double Take_Profit()
【Take_Profitという関数名で、double型の数値を返す。】
{※ここから
int StopLoss = MarketInfo(Symbol(),MODE_STOPLEVEL);
【注文時に決済注文を同時に発注する場合の最低利益をStopLossに格納】
int FreezLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL);
【成り行き決済した場合の最低利益をFreezLevelに格納】
if(StopLoss>TakeProfit){TPf=StopLoss;}else{TPf=TakeProfit;}
【StopLossとTakeProfit(大域変数)を比べて、大きい方をTPfに格納】
if(FreezLevel>TPf)TPf=FreezLevel;
【FreezLevelがTPfより大きい場合、TPfにFreezLevelを格納】
return(TPf);
【求められた数値を、Double型で、この関数を呼び出したところに、返す。】
}※ここまで
次回に続く・・・・・・・・・
登録:
投稿
(
Atom
)