分离复杂逻辑,以模块化编程思维实现实现层和调用层分离的编程思想
什么是组件化开发?
- 前端调用层和后端实现层的解耦
- 可拔插式程序设计,整体程序逻辑不会崩塌
- 有效的减少BUG错误和逻辑错误产生
- 具有复用性
- 提高编程效率

止损止盈价格趋势线

代码实现
// 验证单词: validator
// 1交易品种验证组件
bool valSymbol(const string symbol)
{
// 保留接口位置
string m_sym = "";
if(symbol == NULL || symbol == "") m_sym = _Symbol;
else m_sym = symbol;
bool sym = SymbolSelect(m_sym, true);
return sym;
}
// 2交易品种验证组件
bool valType(const int type)
{
if(type < 0 || type > 1) return false;
return true;
}
// 3 验证交易手数组件
double valVolume(const string symbol, const double volume)
{
// 获取交易品种最小下单量
double min_vol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
// 判断用户输入的值是否合法
if(volume <= min_vol) return NormalizeDouble(min_vol, 2);
// 如果用户输入大于最大手数
double max_vol = SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
if(volume > max_vol) return NormalizeDouble(min_vol, 2);
else return volume;
}
//4 验证止损价组件
double valStopLossPrice(const string symbol,const int type, const double price, const int sl)
{
// 拦截非法数据
if(price <= 0.0 || sl <= 0) return 0.0;
SymbolInfo sym_info;
getSymbolInfo(symbol,sym_info);
double sl_price = 0.0;
if(type == 0)
{
double sl_level = NormalizeDouble(price - sl * sym_info.point, sym_info.digits);
double ask_level = NormalizeDouble(sym_info.ask - sym_info.stops_level * sym_info.point, sym_info.digits);
if(sl_level <= ask_level) sl_price = sl_level;
}
else if(type == 1)
{
double sl_level = NormalizeDouble(price + sl * sym_info.point, sym_info.digits);
double bid_level = NormalizeDouble(sym_info.bid + sym_info.stops_level * sym_info.point, sym_info.digits);
if(sl_level >= bid_level) sl_price = sl_level;
}
return sl_price;
}
//5 验证止赢价组件
double valSLTPPrice(const string symbol, const int type, const int points, const int up_dwon)
{
if(points <= 0.0) return 0.0;
double ask = SymbolInfoDouble(symbol,SYMBOL_ASK);
double bid = SymbolInfoDouble(symbol,SYMBOL_BID);
double m_value = 0.0;
if(type == 0)
{
if(up_dwon == 0)m_value = valStopLossPrice(symbol,type,ask,points);
else if(up_dwon == 1)m_value = valTakeProfitPrice(symbol,type,ask,points);
}
if(type == 1)
{
if(up_dwon == 0)m_value = valStopLossPrice(symbol,type,bid,points);
else if(up_dwon == 1)m_value = valTakeProfitPrice(symbol,type,bid,points);
}
return m_value;
}
// 6 验证滑点组件
int valDeviation(const int dev)
{
if(dev < 5) return 5;
return dev;
}
调用组件
bool PositionSend(const string symbol, // 交易品种 1
const int type, // 定单方向 2
const double volume, // 定单手数 3
const int sl, // 止损价 4
const int tp, // 止盈价 5
const int deviation, // 滑点 6
const string comment, // 定单注释 7
const ulong magic // EA识别码 8
)
{
// 组装组件
if(valSymbol(symbol) == true)
{
double ask = SymbolInfoDouble(symbol,SYMBOL_ASK);
double bid = SymbolInfoDouble(symbol,SYMBOL_BID);
// double m_vol = volume;
double m_vol = valVolume(symbol, volume);
double m_sl = 0.0; double m_tp = 0.0;
if(type == 0)
{
m_sl = valStopLossPrice(symbol,type,ask,sl);
m_tp = valTakeProfitPrice(symbol,type,ask,tp);
}
else if(type == 1)
{
m_sl = valStopLossPrice(symbol,type,bid,sl);
m_tp = valTakeProfitPrice(symbol,type,bid,tp);
}
int m_dev = valDeviation(deviation);
bool is_ok = PositionSendBase(symbol,type,m_vol,m_sl,m_tp,m_dev,comment,magic);
if(is_ok) return true;
}
return false;
}
前端用户体验
void OnStart()
{
// printf("buy type: %d, sell type: %d", ORDER_TYPE_BUY, ORDER_TYPE_SELL);
//PositionSend(_Symbol, 0, 0.01, 100, 200, 5, "buy + 1", 819921);
PositionSend(_Symbol, 1, 0.11, 150, 150, -5, "sell + 1", 819921);
}