RainBoltz / pymfae

Maximum favorable excursion and Maximum adverse excursion calculation Toolkit
7 stars 1 forks source link

MQL5 版本今天(7.21)完成, 或許可以做為 Python 版本的參考 #4

Open fatfingererr opened 5 years ago

fatfingererr commented 5 years ago

我今天整理了一下 舊的 code, 整理出一個非侵入式的 MQL5 版本 只要跑出交易列表 (Trade List), 換一個 EA 再跑一次就能跑出所有 mae mfe (可以多個交易列表)

image

我會為這個版本錄個影片, 預計明天(7.22) 或後天 (7.23) 會放上 Youtube 到時候可以參考看看影片內容和我的 mql5 codebase (影片同時會丟出 codebase)

或許目前你心裡想的版本和我的 mql5 codebase 版本不同 其實我自己 cpp 的 code 是嵌在 trading code 裡面, 有一個 framework, 只是 enable 與否 也和我這次整理出來的 MQL5 的寫法不同, 我主要是想給不懂寫 EA 的人容易使用

我覺得最主要大概是 update 的邏輯那個區塊蠻複雜的, 誰 Updated 完要換誰 Update, 這部分至少我有 valid 過. 類似這樣 : ( 我想至少可以作為之後 Unit Test 的 Case 參考)

void TrackBuyOrderMAEMFE(const double now_entry,const double now_exit, int i)
  {
   const datetime now=TimeCurrent();
   if(AStrictlyLessThanB(now_entry,g_trade_list_open_price[i]))
     {
      if(AStrictlyLessThanB(now_entry,g_entry_mae_price[i]))
         UpdateEntryMAEPrice(now_entry,now,i);
      if(AStrictlyLessThanB(now_entry,g_entry_mae_after_mfe_price[i]))
         UpdateEntryMAEAfterMFEPrice(now_entry,now,i);
     }
   if(AStrictlyMoreThanB(now_exit,g_exit_mfe_price[i]))
     {
      UpdateExitMFEPrice(now_exit,now,i);
      ResetExitMAEAfterMFEPrice(i);
      UpdateExitMAEBeforeMFEPrice(i);
      UpdateExitMFEBeforeMAEBeforeMFEPrice(i);
      ResetEntryMAEAfterMFEPrice(i);
      UpdateEntryMAEBeforeMFEPrice(i);
     }
   else if(AStrictlyLessThanB(now_exit,g_trade_list_open_price[i]))
     {
      if(AStrictlyLessThanB(now_exit,g_exit_mae_price[i]))
        {
         UpdateExitMAEPrice(now_exit,now,i);
         UpdateExitMFEBeforeMAEPrice(i);
        }
      if(AStrictlyLessThanB(now_exit,g_exit_mae_after_mfe_price[i]))
         UpdateExitMAEAfterMFEPrice(now_exit,now,i);
     }
   if(AStrictlyMoreThanB(g_exit_mfe_price[i]-now_exit,g_exit_mhl_value[i]))
      UpdateExitMHLPrice(now_exit,now,i);
   if(AStrictlyMoreThanB(now_entry,g_trade_list_open_price[i]))
     {
      if(AStrictlyMoreThanB(now_entry,g_entry_mfe_price[i]))
        {
         UpdateEntryMFEPrice(now_entry,now,i);
         ResetEntryMAEAfterMFEPrice(i);
         UpdateEntryMAEBeforeMFEPrice(i);
         UpdateEntryMFEBeforeMAEBeforeMFE(i);
        }
      }else if(AStrictlyLessThanB(now_entry,g_entry_mae_price[i]))
        {
         UpdateEntryMAEPrice(now_entry,now,i);
         UpdateEntryMFEBeforeMAEPrice(i);
        }
      if(AStrictlyMoreThanB(g_entry_mfe_price[i]-now_entry,g_entry_mhl_value[i]))
         UpdateEntryMHLPrice(now_entry,now,i);
  }

上面 entryexit 的 prefix 差別是, exit 是出場用的, 是正常的 entry 是用和 entry 時的價格一樣的報價 例如 long entry 是在 ask 進場, 計算 MAEMFE 應該在 bid price, 這就是 exit prefix 反之 long entry 在 ask 但我還是用 ask 算 MAEME 這就是 entry prefix 正常的 MAEMFE 應該是用 exit 只是我多算 entry 是因為要看亞洲時間報價 ask bid spread 的影響

RainBoltz commented 5 years ago

沒錯,我目前是在做離線的版本...因為我以為是order close掉之後才會計算MAE/MFE (但看起來Ricky的code是直接同步計算?)

我這邊先記錄一下還沒看影片之前的一些問題:

  1. 一般來說,常見的已經closed掉的order是怎樣的結構?(在excel中 或 程式裡面,我目前都是假設 至少會有 進場時間和出場時間,這樣搭配市場歷史價格就可以計算了)
  2. Ricky上方程式碼中間有出現 MAEBeforeMFE 相關的東西,是指MFE發生前的MAE嗎?是用來算第幾level的嗎?
  3. MHL 又是什麼呢?

然後我大概知道 g_ prefix應該是 global variable的意思 ~