最初に、1回ポジションを株価870円の時に1148株で998760円分株を購入して
ずっと20年持ち続けた場合は、772145円利益が出た
こっちが、100万円の資金から始まって2%のリスクをとってトレードした結果
資金は、590456利益が出た
やっぱり、長期投資のほうが有利じゃないか!
という結果になっている。
たった一度、株を購入し忘れているだけで
それなりの利益が出ている
これに配当が付いていたはずなので、年4%で20年なら80万円があったとして
加算すると、160万円の利益がでたことになる
売買を繰り返した結果の60万円と100万円の差がでている
ここだけで比較すると長期投資はかなり強力な結果となる
これを今後覆せるのか?
さて、今後は、下のやりたいことを順番にやっていくつもりだ
- ある程度利益が出たら、損切位置を1回だけ上げるブレイクイーブン機能を追加して
- 利益が出るごとに、損切位置をずっと上げていくトレーリングストップ機能を追加して
- ピラミッティング機能を入れて
- 毎日、トレードしているロジックをランダムでトレードするようにして
- それを、たくさん検証して
- ほかの銘柄も試してみて
ここまでやって、めちゃくちゃなトレードをしたらどういう結果になるかがわかる
結果が楽しみだ
早く、そこまで行きたいが
単元未満株縛りで作っているので、逆指値、指値がMT5の機能を使えないので作るのが難しいし
正月休みとはいえ、家族行事で時間がとれなんだよね
文字数稼ぎで、プログラムを載せます
drive.google.com
//+------------------------------------------------------------------+ //| test.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" // 注文関連 #include "OriginalTrade.mqh" // 注文関連機能を提供するファイルをインクルード OriginalCTrade Trade; // 取引のための主要インスタンス OriginalCPositions Positions; // ポジション管理のためのインスタンス // 価格情報 #include "OriginalPrice.mqh" // 価格データ取得のためのファイルをインクルード OriginalCBars Price; // 価格情報を管理するインスタンス // タイマー #include "OriginalTimer.mqh" // タイマー機能を提供するファイルをインクルード OriginalCNewBar NewBar; // 新しいバーが生成されたかを検出するインスタンス // インジケータ #include "OriginalIndicators.mqh" // インジケータを扱うためのファイルをインクルード CDerivediATR Atr;//ATRのインスタンス //+------------------------------------------------------------------+ //| Input変数 | //+------------------------------------------------------------------+ input group "基本取引設定" // 基本取引設定のグループ化 input ulong Slippage = 1; // スリッページ設定 input ulong MagicNumber = 123; // EA識別番号 input bool TradeOnNewBar = true; // 新しいバーでの取引を行うかどうか input group "ATRの設定" // ATR設定のグループ化 input int ATRPeriod = 14; // ATR平均線の期間 input group "資金管理" // 資金管理設定のグループ化 input bool UseMoneyManagement = true; // マネーマネジメントを使用するかどうか input double RiskPercent = 2; // リスク許容度(%) input double RiskMargin = 1000.0; //許容損失額を設定する input double RiskToReward = 2.0; // リスクリワードの比率 //+------------------------------------------------------------------+ //| グローバル変数 | //+------------------------------------------------------------------+ ulong glBuyTicket;//ポジション番号を格納する変数 double gRiskMargin; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // フィルポリシーを取得する ENUM_ORDER_TYPE_FILLING filltype = FillPolicy(); // EAのマジックナンバーを設定する Trade.SetMagicNumber(MagicNumber); Positions.SetMagicNumber(MagicNumber); // 注文実行時の許容スリッページを設定する Trade.SetDeviation(Slippage); // 取得したフィルポリシーを設定する Trade.SetFillType(filltype); // 価格情報の初期化 Price.Init(_Symbol, _Period); // 短期移動平均線の初期化 Atr.Init(_Symbol, _Period, ATRPeriod); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // 新しいバーがあるかどうかの初期状態をtrueと仮定し、バーシフトを0に設定 bool newBar = true; int barShift = 0; // 新しいバーでの取引を行う場合の処理 if(TradeOnNewBar == true) { // 現在のシンボルと期間で新しいバーが始まったかどうかをチェック newBar = NewBar.CheckNewBar(_Symbol,_Period); // 新しいバーが確認された場合、バーシフトを1に設定 barShift = 1; } // 新しいバーの確認 if(!newBar) return; // 計算結果を取得できるようにする Price.Update(); // ロット調整 double tradeSize; //資金管理モードONなら設定したリスクに応じたロットを算出 if(UseMoneyManagement == true) { //許容損失額を設定する gRiskMargin = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercent / 100); } else { //固定損切幅を指定 gRiskMargin = RiskMargin; } // Positions.GetPosInfo(); // Positions.GetBuyPosCount() // ポジションの確認 if(glBuyTicket == 0) { // ポジションを持っていない // 計算結果を取得できるようにする Atr.Update(); double atr = Atr.Main(barShift); tradeSize = MathFloor(gRiskMargin / (atr * 2.0)); if(tradeSize<=0.0) tradeSize = 1.0; glBuyTicket = Trade.Buy(_Symbol, tradeSize); } else { // ポジションを持っている double buyPrice = PositionOpenPrice(glBuyTicket); double buyVolume = PositionVolume(glBuyTicket); double buyClose = Price.Close(barShift); double buyProfit = (buyClose - buyPrice) * buyVolume; double buyReward = gRiskMargin * RiskToReward; if(buyProfit > buyReward || buyProfit <= -gRiskMargin) { Trade.ClosePosition(glBuyTicket); glBuyTicket = 0; } } }