2025年4月10日 星期四

MT5 外匯商品 交易策略開發 [01] 說明

這篇使用針對 MT5 外匯商品 交易策略開發 [01] 內容作一些說明 有助於了解部落格後續文章內相關的 MT5 語法及架構

#include

這行指的是引入 MQL5 提供的交易類別庫,包含一系列預定義的功能,用於執行交易操作(如下單、修改訂單和平倉)。這使得交易邏輯的實現更加高效和簡潔。

#include

這行代表引入一個命名為 MagicMT5_函數庫V1.mqh 的自定義函數庫。此函數庫可能包含自定義的輔助工具或功能,專門用來加強交易策略、數據處理或特殊操作。如果這是您自己設計的函數庫,則可能已經加入了獨特的邏輯來支持您的算法需求。

ENUM_TIMEFRAMES 時間週期 = PERIOD_M20;

這行代碼創建一個 ENUM_TIMEFRAMES 類型的變數,名稱為 時間週期,並將其初始值設定為 PERIOD_M20

ENUM_TIMEFRAMES  MQL5 中的一個列舉類型,用來表示不同的時間週期(例如,1分鐘、5分鐘或小時級別的時間框架)。

PERIOD_M20 代表 20 分鐘的時間框架,這通常用於技術分析、指標計算或交易策略中的決策邏輯。

int OnInit()

OnInit()  MQL5 中的初始化事件函數,專門用來處理當程式(例如 Expert Advisor)被加載到圖表上時的初始化工作。

它的回傳型態為整數(int),通常表示初始化結果。

LoadEA = TimeCurrent();

此行將伺服器的當前時間(TimeCurrent())賦值給變數 LoadEA

TimeCurrent()  MQL5 的內建函數,提供以秒數表示的伺服器時間。

此操作常用於記錄 EA 啟動的時間,例如方便在後續的邏輯中進行時間相關的分析或操作。

return(INIT_SUCCEEDED);

INIT_SUCCEEDED  MQL5 定義的常數,用來表示初始化成功。

回傳值告訴系統 EA 已成功完成初始化,可進行正常運行。

若遇到初始化失敗的情況,您可以使用 return(INIT_FAILED) 等選項來反映問題。

OnTick 函數邏輯,主要用於處理每次市場資料更新(即每個新 Tick 到達時)執行的操作。

if(AccountInfoDouble(ACCOUNT_BALANCE) <= 資金風控)

此條件用於檢查帳戶的餘額是否低於「資金風控」的設定值。

若餘額不足,則觸發警報提示,並透過 return 終止後續操作。

使用 AccountInfoDouble(ACCOUNT_BALANCE) 函數,可以獲取帳戶目前的可用資金。

BarNumber = iBarShift(Symbol(),時間週期,LoadEA);

透過 iBarShift() 函數,獲得指定商品(Symbol())、指定時間週期(時間週期)自某一點時間(LoadEA)以來的 K 棒數量。

此變數主要用於回測區間內的 K 棒數分析。

BarSinceExit = BarNumber - CloseOrderNo;

計算自前一次交易平倉(CloseOrderNo)後至當前的 K 棒數量。

此變數可用於控制交易頻率或設置間隔限制。

if((BarNumber == 1 && BarNumber != JudgeNo))

判斷當前是否為第 1 K 棒(BarNumber == 1),且與上次判斷的 K 棒不同(BarNumber != JudgeNo)。

此條件可能是策略中判斷進場的觸發條件。

多單進場單號 = Buy_at_MARKET(Symbol(),Lots,0,0,"1st_K",MagicNumber);

呼叫自定義函數 Buy_at_MARKET(),進行多單進場操作。

輸入參數包括商品名稱(Symbol())、手數(Lots)、止損、止盈以及其他附加設定。

MagicNumber 是用於識別該交易的唯一標記。

LX_CloseByTicket(多單進場單號, Lots);

呼叫自定義函數 LX_CloseByTicket(),用來平倉指定單號(多單進場單號)的部分或全部倉位。

此處執行的是根據手數(Lots)進行平倉。

CloseOrderNo = iBarShift(Symbol(),時間週期,LoadEA);

更新平倉的 K 棒編號,用於後續的交易條件判斷。

FastSma = MathMin(LenA1, LenB1);

使用 MathMin() 函數,計算較短的均線周期,用於生成快速均線(FastSma)。

可能代表短期趨勢。

SlowSma = MathMax(LenA1, LenB1);

使用 MathMax() 函數,計算較長的均線周期,用於生成慢速均線(SlowSma)。

可能用於判斷長期趨勢。

 

if(BarNumber != JudgeNo)

條件判斷:檢查當前的 K 棒編號(BarNumber)是否與最後一次判斷的 K 棒(JudgeNo)不同。

若條件成立,執行以下操作:

K();:呼叫自定義函數,可能用來更新或切換 K 棒狀態。

允許交易時段 設定:透過 getTM_hour(TimeCurrent()) 函數,檢查當前時間是否在交易允許的範圍內(例如:早上 10 點至凌晨 2 點)。

Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);

獲取商品的最新買價(Ask)。

使用內建函數 SymbolInfoDouble() 來獲取指定商品的價格資訊。

Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);

獲取商品的最新賣價(Bid)。

同樣使用 SymbolInfoDouble(),針對商品的交易價格。

AccountBalance=AccountInfoDouble(ACCOUNT_BALANCE);

獲取帳戶的當前資金餘額。

此資訊通常用於進一步的風控或計算。

Tickvalue=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE);

獲取商品的每 Tick 的價值(即價格波動最小單位的價值)。

此變數可能用於手數或風險計算。

SP = NormalizeDouble(MathAbs(Ask-Bid),Digits());

計算買賣價差(Spread),使用 MathAbs() 取得絕對值,並透過 NormalizeDouble() 格式化至商品的價格小數位數(Digits())。

這通常是用來判斷市場流動性或交易成本。

動態計算交易手數:

if(Lots_AutoCal == true)

檢查是否啟用自動計算手數(Lots_AutoCal)。

若啟用,執行以下操作:

Lots = get_dynamic_lot_size(Lots_Even,Symbol(),RiskPercent,AccountBalance,SL);

呼叫自定義函數 get_dynamic_lot_size(),根據以下參數動態計算手數:

Lots_Even:基準手數。

Symbol():商品符號。

RiskPercent:每筆交易的風險百分比。

AccountBalance:帳戶資金餘額。

SL:止損距離。

Lots = MathMin(0.3,MathMax(0.01,Lots));

限制計算出來的手數範圍:最低 0.01 手,最高 0.3 手。

使用 MathMin()  MathMax() 控制手數範圍。

  進場條件檢查

if(允許交易時段 == true)

檢查是否處於允許的交易時段。只有在交易時段內,此區塊的邏輯才會被執行。

這是防止非交易時段內的自動交易操作。

多單進場邏輯

LE_Cond = (_3GreatThanBBUp());

這是一個自定義條件(可能是技術指標),用於檢查是否滿足進場多單的條件。

假設 _3GreatThanBBUp() 是布林帶上軌突破等條件的檢查邏輯。

清倉空單:sell_order_close_all()

如果目前有空單(空單部位() > 0),並且 K 棒編號不等於上次交易的 K 棒(BarNumber != OrderBarNo),則將所有空單平倉。

多單建立:

買入價格 計算

透過 Highest_OHLC() 函數計算當日最高價格,加上一定的範圍偏移量(Range[1]*0.5),並格式化為指定小數位數(Digits())。

市價單進場:Buy_at_MARKET()

如果無持有多單(多單部位() == 0)且距離上次平倉超過 1 K 棒(BarSinceExit > 1),則執行市價多單進場。

使用自定義函數 Buy_at_MARKET(),進行市價買入操作,並保存該單的編號(多單進場單號)。

更新交易 K 棒編號:OrderBarNo

進場後,將交易的 K 棒編號更新,用於避免重複交易。

空單進場邏輯

SE_Cond = (DayBlack3Bar_LClose() && a_RSIA[1] > 50);

檢查是否滿足進場空單的條件:

DayBlack3Bar_LClose() 可能表示「日線三根黑棒」的條件檢查。

a_RSIA[1] > 50 表示 RSI 指標的某個值大於 50

清倉多單:buy_order_close_all()

如果目前有多單(多單部位() > 0),並且 K 棒編號不等於上次交易的 K 棒(BarNumber != OrderBarNo),則將所有多單平倉。

空單建立:

賣出價格 計算

透過 Lowest_OHLC() 函數計算當日最低價格,減去一定的範圍偏移量(Range[1]*0.5),並格式化為指定小數位數。

掛單空單進場:Short_at_STOP()

如果無持有空單(空單部位() == 0),且距離上次平倉超過 1 K 棒(BarSinceExit > 1),並且上一根收盤價大於計算的賣出價格(Close[1] > 賣出價格),則執行掛單賣出操作。

使用自定義函數 Short_at_STOP(),設定 Stop 掛單進行賣出。

更新交易 K 棒編號:OrderBarNo

掛單成功後,將交易的 K 棒編號更新。

功能概述:

進場條件檢查:

根據布林帶或技術指標等條件判斷多單或空單進場。

僅在允許的交易時段內執行邏輯。

多單與空單的動作互斥:

清倉對沖的倉位(如進多單前平空單,進空單前平多單)。

動態計算價格:

根據當日最高/最低價格,結合一定範圍偏移量計算進場價格。

交易限制:

通過 BarNumber  OrderBarNo 避免同一根 K 棒內重複交易。

通過 BarSinceExit 控制平倉後的進場間隔。

 

多單平倉邏輯

條件檢查

if(多單部位() > 0)

確保目前有多單部位(倉位數量大於零)時才執行平倉邏輯。

停利與停損的計算

多單進場價格 = LE_EntryPrice(MagicNumber,多單進場單號);

使用自定義函數 LE_EntryPrice(),根據進場單號(多單進場單號)和魔術號(MagicNumber)獲取多單的進場價格。

多單停利價格 = 多單進場價格 + TP * Point();

計算多單的停利價格(TP),即在進場價格的基礎上加上目標點數(TP)。

多單停損價格 = 多單進場價格 - SL * Point();

計算多單的停損價格(SL),即在進場價格的基礎上減去止損點數(SL)。

判斷平倉條件

LX_Cond 定義:

LX_Cond = ((Close[1] <= 多單停利價格 && Bid > 多單停利價格) || (Close[1] >= 多單停損價格 && Bid < 多單停損價格));

檢查多單是否達到停利或停損條件:

停利條件:上一根 K 棒收盤價低於或等於停利價格,且當前買價(Bid)超過停利價格。

停損條件:上一根收盤價高於或等於停損價格,且當前買價低於停損價格。

執行平倉

if(LX_Cond == true && BarNumber != CloseOrderNo)

確保符合平倉條件,且 K 棒編號不同於上次平倉時的 K 棒(避免重複執行)。

LX_CloseByTicket(多單進場單號, Lots);

呼叫自定義函數,將指定單號的多單進行平倉。

更新平倉 K 棒編號:

if(多單部位() == 0) { CloseOrderNo = iBarShift(Symbol(), 時間週期, LoadEA); }

平倉成功後,更新平倉時的 K 棒編號,避免重複執行平倉邏輯。

空單平倉邏輯

條件檢查

if(空單部位() > 0)

確保目前有空單部位時才執行平倉邏輯。

停利與停損的計算

空單進場價格 = SE_EntryPrice(MagicNumber, 空單進場單號);

使用自定義函數 SE_EntryPrice() 獲取空單進場價格。

空單停利價格  空單停損價格 計算:

空單停利價格 = MathMin(a_ICHI_SA[1], a_ICHI_SB[1]) - Range[1] * 2;

空單停損價格 = MathMax(a_ICHI_SA[1], a_ICHI_SB[1]) + Range[1] * 2;

a_ICHI_SA[1]  a_ICHI_SB[1] 可能是 Ichimoku 指標(基準線和轉換線)的值。

空單停利價格:取這些指標的較小值減去偏移範圍。

空單停損價格:取這些指標的較大值加上偏移範圍。

判斷平倉條件

SX_Cond 定義:

SXcond51 = (空單進場價格 > 空單停利價格 && Close[1] >= 空單停利價格 && Ask < 空單停利價格);

SXcond52 = (空單進場價格 < 空單停損價格 && Close[1] <= 空單停損價格 && Ask > 空單停損價格);

SX_Cond = (SXcond51 == true || SXcond52 == true);



判斷空單是否達到停利或停損條件:

停利條件:進場價格高於停利價格,且上一根收盤價大於或等於停利價格,並且賣價低於停利價格。

停損條件:進場價格低於停損價格,且上一根收盤價小於或等於停損價格,並且賣價高於停損價格。

執行平倉

if(SX_Cond == true && BarNumber != CloseOrderNo)

確保符合平倉條件,並避免重複執行。

SX_CloseByTicket(空單進場單號, Lots);

呼叫自定義函數,將指定單號的空單平倉。

更新平倉 K 棒編號:

if(空單部位() == 0) { CloseOrderNo = iBarShift(Symbol(), 時間週期, LoadEA); }

更新判斷編號

JudgeNo = iBarShift(Symbol(), 時間週期, LoadEA);

更新最後的判斷 K 棒編號,確保進場和平倉的邏輯同步。

 

多單部位

函數定義

int 多單部位()

 {

int count;

count = get_TradeCounts(Symbol(), MagicNumber, POSITION_TYPE_BUY);

return count;

}

功能: 計算當前多單的部位數量。

邏輯:

使用自定義函數 get_TradeCounts(),傳遞當前交易商品(Symbol())、專屬識別碼(MagicNumber)及多單類型(POSITION_TYPE_BUY)。

該函數返回多單部位的數量,並存入 count,最後回傳此值。

用途: 確認是否有持倉多單,供進場/平倉邏輯使用。

2. 空單部位

函數定義

int 空單部位()

{ int count;

count = get_TradeCounts(Symbol(), MagicNumber, POSITION_TYPE_SELL);

return count;

}

功能: 計算當前空單的部位數量。

邏輯:

 多單部位() 類似,不同點在於這裡判斷的是空單部位數量(POSITION_TYPE_SELL)。

用途: 確認是否有持倉空單,用於進場或平倉操作。

3. K

函數定義

void K()

{ // K棒刪除所有掛單

if(total_pending_order_count(Symbol(), MagicNumber, -1) != 0)

{

delete_pending_orders_all(Symbol(), MagicNumber, -1, 0x0000ff);

}

 Set_OHLC_Bar_Series();

Set_OHLC_Day_Series();

Get_OHLC_Bar(10);

Get_OHLC_Day(10);

set_BarInfo();

set_BBAND();

set_RSI();

set_ICHIMOKU();

}



功能解釋

刪除所有掛單

total_pending_order_count(Symbol(), MagicNumber, -1)

計算當前所有掛單的數量。

delete_pending_orders_all()

如果有掛單,則刪除所有掛單。

使用 MagicNumber 和商品符號(Symbol())進行過濾,確保只刪除與特定識別碼相關的掛單。

OHLC 資料更新

Set_OHLC_Bar_Series()  Set_OHLC_Day_Series()

更新當前 K 棒和日線的開高低收(OHLC)數據序列。

取得 OHLC

Get_OHLC_Bar(10)  Get_OHLC_Day(10)

抓取最近 10 K 棒及最近 10 天的 OHLC 值,用於後續邏輯。

技術指標設定

set_BarInfo():可能設定當前 K 棒的其他資訊。

set_BBAND():設定布林通道指標。

set_RSI():設定 RSI 指標。

set_ICHIMOKU():設定一目均衡表。

用途

此函數用於每當新 K 棒生成時,更新 OHLC 資料與技術指標,並清除舊掛單,確保交易環境整潔且邏輯一致。

 

 

全域變數宣告

double Open[], High[], Low[], Close[], Range[], Body[], UPshadow[], DNshadow[]; double OpenD[], HighD[], LowD[], CloseD[];



定義了多個陣列變數,用於儲存 K 棒資料(開盤價、最高價、最低價、收盤價等):

Open[]High[]Low[]Close[] 儲存當前時間框架的開高低收數據。

Range[] 計算 K 棒的振幅(高價-低價)。

Body[] 計算 K 棒實體的長度(收盤價-開盤價的絕對值)。

UPshadow[]  DNshadow[] 分別計算上影線和下影線的長度。

OpenD[]HighD[]LowD[]CloseD[] 儲存日線資料的開高低收。

2. 陣列序列設定

設定當前時間框架的陣列序列

void Set_OHLC_Bar_Series()

 {

 ArraySetAsSeries(Open, true);

ArraySetAsSeries(High, true);

ArraySetAsSeries(Low, true);

ArraySetAsSeries(Close, true);

}

功能:

 OpenHighLow  Close 陣列設為時間序列模式ArraySetAsSeries())。

時間序列模式將最新的數據儲存在索引 0,舊數據向後排列(索引 12,依此類推)。

取得 K 棒數據

獲取當前時間框架的開高低收數據

void Get_OHLC_Bar(int argCount)

 {

get_OpenData(Symbol(), 時間週期, argCount, Open);

get_HighData(Symbol(), 時間週期, argCount, High);

get_LowData(Symbol(), 時間週期, argCount, Low);

get_CloseData(Symbol(), 時間週期, argCount, Close);

}

功能:

使用自定義函數(get_OpenData()get_HighData() 等)從指定的商品和時間週期中獲取指定數量(argCount)的 K 棒數據。

用途:

儲存開盤價(Open)、最高價(High)、最低價(Low)和收盤價(Close)數據到對應的陣列。

設定日線數據的陣列序列

void Set_OHLC_Day_Series()

 {

ArraySetAsSeries(OpenD, true);

ArraySetAsSeries(HighD, true);

ArraySetAsSeries(LowD, true);

ArraySetAsSeries(CloseD, true);

}

功能:

將日線資料的開高低收陣列設為時間序列模式,讓數據按時間倒序排列。

取得日線數據

獲取日線的開高低收數據

void Get_OHLC_Day(int argCount)

 {

get_OpenData(Symbol(), PERIOD_D1, argCount, OpenD);

get_HighData(Symbol(), PERIOD_D1, argCount, HighD);

get_LowData(Symbol(), PERIOD_D1, argCount, LowD);

get_CloseData(Symbol(), PERIOD_D1, argCount, CloseD);

}

功能:

通過 get_OpenData()get_HighData() 等函數,獲取指定商品在日線週期(PERIOD_D1)的開高低收數據。

6. 計算 K 棒的其他屬性

計算振幅、實體、上影線和下影線

void set_BarInfo()

{

ArrayResize(Range, ArraySize(Open));

ArraySetAsSeries(Range, true);

ArrayResize(Body, ArraySize(Open));

ArraySetAsSeries(Body, true);

ArrayResize(UPshadow, ArraySize(Open));

ArraySetAsSeries(UPshadow, true);

ArrayResize(DNshadow, ArraySize(Open));

ArraySetAsSeries(DNshadow, true);

for(int i = 0; i < ArraySize(Open) - 1; i++)

{

Range[i] = High[i] - Low[i];

Body[i] = MathAbs(Close[i] - Open[i]);

UPshadow[i] = High[i] - MathMax(Close[i], Open[i]);

DNshadow[i] = MathMin(Close[i], Open[i]) - Low[i]; }

}



功能:

動態調整陣列大小(ArrayResize())以配合當前 K 棒數據的數量。

設定陣列為時間序列模式。

計算並儲存每根 K 棒的以下屬性:

振幅(Range[i]): 高價減低價。

實體(Body[i]): 收盤價與開盤價的絕對值。

上影線(UPshadow[i]): 高價減去較高的價格(MathMax(Close[i], Open[i]))。

下影線(DNshadow[i]): 較低的價格(MathMin(Close[i], Open[i]))減去低價。

功能總結

動態設定 K 棒與日線的數據序列:

開盤價(Open)、最高價(High)、最低價(Low)、收盤價(Close)。

適用於當前時間框架及日線數據。

計算 K 棒屬性:

根據開高低收計算振幅、實體、上影線與下影線,用於技術分析或策略設計。

模組化設計:

Set_OHLC_Bar_Series()  Set_OHLC_Day_Series() 負責設定序列。

Get_OHLC_Bar()  Get_OHLC_Day() 負責獲取數據。

set_BarInfo() 計算 K 棒額外的屬性。

 

這段程式碼負責計算布林通道(Bollinger Bands)相關的資訊,並根據布林通道的上軌和下軌設置一些邏輯條件(例如突破和收縮)。以下是逐步解析:

主要邏輯:布林通道與相關條件

全域變數宣告

bool UpBreak, DnBreak, Shrink; double a_BBUP[], a_BBDN[];

UpBreak  DnBreak

用於記錄布林通道的上軌和下軌突破條件。

Shrink

用於檢查布林通道的收縮情況(上軌與下軌向內收縮)。

a_BBUP[]  a_BBDN[]

分別儲存布林通道的上軌和下軌值。

設置布林通道參數

BBLen = MathMax(LenA2, LenB2);

功能:

設定布林通道的週期(BBLen),取 LenA2  LenB2 的較大值作為布林通道長度。

初始化布林通道指標

h_BBUP = iBands(Symbol(), 時間週期, BBLen, 0, 2, PRICE_CLOSE);

ArraySetAsSeries(a_BBUP, true);

h_BBDN = iBands(Symbol(), 時間週期, BBLen, 0, 2, PRICE_CLOSE);

ArraySetAsSeries(a_BBDN, true);

iBands() 函數:

MQL5 的內建函數,用於計算布林通道指標。

參數:

Symbol():交易商品。

時間週期:指定的時間框架。

BBLen:布林通道的週期長度。

PRICE_CLOSE:布林通道以收盤價為計算基礎。

分別計算布林通道的上軌(h_BBUP)和下軌(h_BBDN)。

ArraySetAsSeries()

設置陣列為時間序列模式,以便數據按時間倒序排列(最新值在索引 0)。

4. 獲取布林通道數據

get_IndexData(h_BBUP, 1, 0, 10, a_BBUP); get_IndexData(h_BBDN, 2, 0, 10, a_BBDN);

功能:

使用自定義函數 get_IndexData() 獲取布林通道的上軌(a_BBUP[])和下軌(a_BBDN[])的歷史數據。

參數包含:

指標句柄(h_BBUP  h_BBDN)。

線索引(1 表示上軌,2 表示下軌)。

數據起始點和數量(例如,從索引 0 開始獲取 10 條數據)。

5. 布林通道條件設置

突破條件

UpBreak = (High[1] > a_BBUP[1]) && (High[2] > a_BBUP[2]);

DnBreak = Low[1] < a_BBDN[1] && Low[2] < a_BBDN[2];

UpBreak 檢查上軌突破條件:

前一根 K 棒的高價(High[1])突破布林通道的上軌(a_BBUP[1])。

更前一根 K 棒的高價(High[2])也突破布林通道的上軌(a_BBUP[2])。

DnBreak 檢查下軌突破條件:

前一根 K 棒的低價(Low[1])低於布林通道的下軌(a_BBDN[1])。

更前一根 K 棒的低價(Low[2])也低於布林通道的下軌(a_BBDN[2])。

收縮條件

ShrinkUp = a_BBUP[1] > a_BBUP[2] && a_BBUP[2] > a_BBUP[3] && a_BBUP[5] > a_BBUP[4] && a_BBUP[4] > a_BBUP[3];

ShrinkDn = a_BBDN[1] < a_BBDN[2] && a_BBDN[2] < a_BBDN[3] && a_BBDN[5] < a_BBDN[4] && a_BBDN[4] < a_BBDN[3];

Shrink = ShrinkUp || ShrinkDn;



ShrinkUp 布林通道的上軌逐步縮小:

最近 3 根([1][2][3])以及更早的 2 根([5][4])的布林通道上軌值依次減小。

ShrinkDn 布林通道的下軌逐步縮小:

最近 3 根([1][2][3])以及更早的 2 根([5][4])的布林通道下軌值依次減小。

Shrink 如果上軌或下軌任意一方發生收縮,則條件成立。

功能總結

設定布林通道:

計算布林通道的上軌與下軌,並獲取歷史數據。

判斷布林通道條件:

突破條件:檢查價格是否突破布林通道的上軌或下軌。

收縮條件:檢查布林通道是否向內收縮(上軌降低或下軌提升)。

應用:

UpBreak  DnBreak 可用於判斷價格的突破交易機會。

Shrink 可用於檢測市場波動減小的狀況,通常暗示市場可能面臨新趨勢的爆發。

 

計算 RSI

函數:set_RSI()

double a_RSIA[], a_RSIB[]; void set_RSI()

{

int h_RSIA, h_RSIB;

h_RSIA = iRSI(Symbol(), 時間週期, LenA1, PRICE_CLOSE);

ArraySetAsSeries(a_RSIA, true);

get_IndexData(h_RSIA, 0, 0, 5, a_RSIA);

h_RSIB = iRSI(Symbol(), 時間週期, LenB1, PRICE_CLOSE);

ArraySetAsSeries(a_RSIB, true);

get_IndexData(h_RSIB, 0, 0, 5, a_RSIB); }

功能:

計算 RSI 指標值,並將結果存入陣列 a_RSIA[]  a_RSIB[] 中。

邏輯:

使用內建函數 iRSI() 計算 RSI,根據指定的週期(LenA1  LenB1)。

透過 get_IndexData() 獲取指標值的歷史數據。

用途:

RSI 是常用的技術指標,用於判斷市場是否超買或超賣。

計算一目均衡表區間價格

函數:set_ICHIMOKU()

double a_ICHI_B[], a_ICHI_C[], a_ICHI_SA[], a_ICHI_SB[], a_ICHI_LC[];

void set_ICHIMOKU()

{

int h_ICHI_C, h_ICHI_B, h_ICHI_SA, h_ICHI_SB, h_ICHI_LC;

h_ICHI_C = iIchimoku(Symbol(), 時間週期, 9, 26, 52);

ArraySetAsSeries(a_ICHI_C, true);

h_ICHI_B = iIchimoku(Symbol(), 時間週期, 9, 26, 52);

ArraySetAsSeries(a_ICHI_B, true);

h_ICHI_SA = iIchimoku(Symbol(), 時間週期, 9, 26, 52);

ArraySetAsSeries(a_ICHI_SA, true);

h_ICHI_SB = iIchimoku(Symbol(), 時間週期, 9, 26, 52);

ArraySetAsSeries(a_ICHI_SB, true);

h_ICHI_LC = iIchimoku(Symbol(), 時間週期, 9, 26, 52);

ArraySetAsSeries(a_ICHI_LC, true);

get_IndexData(h_ICHI_C, 0, 0, 5, a_ICHI_C);

get_IndexData(h_ICHI_B, 0, 0, 5, a_ICHI_B);

get_IndexData(h_ICHI_SA, 0, 0, 5, a_ICHI_SA);

get_IndexData(h_ICHI_SB, 0, 0, 5, a_ICHI_SB);

get_IndexData(h_ICHI_LC, 0, 0, 5, a_ICHI_LC); }



功能:

計算一目均衡表中的各項指標(如基準線、轉換線、先行線等),並將結果存入對應的陣列。

邏輯:

使用內建函數 iIchimoku() 計算指標,根據一目均衡表的標準參數(92652)。

獲取多條指標線的數據並儲存於陣列中。

用途:

一目均衡表是一種綜合的技術指標,用於判斷市場趨勢、支撐與阻力位。

日線三根黑棒且收盤近三根低

函數:DayBlack3Bar_LClose()

bool DayBlack3Bar_LClose()

{

int j = 0;

for (int i = 1; i <= 3; i = i + 1)

{

if (CloseD[i] < OpenD[i])

{

j = j + 1;

}

}

if ((j == 3 && Close[1] <= MathMin(Close[2], Close[3])))

{

return true;

}

return false;

}



功能:

判斷是否符合「日線連續三根黑棒且最新收盤價接近過去三根最低」的條件。

邏輯:

使用迴圈檢查最近三根日線是否為黑棒(CloseD[i] < OpenD[i])。

確保最新的日線收盤價低於過去三根最低值。

用途:

用於空單進場的邏輯或判斷市場下跌趨勢。

連續三根收盤價高於布林通道上界

函數:_3GreatThanBBUp()

bool _3GreatThanBBUp()

{ int j = 0;

for (int i = 1; i <= 3; i = i + 1)

{

if (Close[i] > a_BBUP[i])

{

j = j + 1;

}

}

if (j == 3)

{

return true;

}

       return false;

}

功能:

判斷最近三根 K 棒的收盤價是否高於布林通道的上界。

邏輯:

使用迴圈檢查最近三根收盤價是否大於布林通道上軌(a_BBUP[i])。

確保連續三根都滿足條件。

 


沒有留言:

張貼留言