金融总结八---多头/空头平仓/开仓

多头/空头平仓/开仓
开仓、平仓、持仓、多头和空头是什么意思?
  开仓也叫建仓,是指投资者新买入或新卖出一定数量的股指期货合约。如果投资者将这份股指期货合约保留到最后交易日,他就必须通过现金交割来了结这笔期货交易。
  平仓,是指期货投资者买入或者卖出与其所持期货合约的品种、数量以及交割月份相同但交易方向相反的股指期货合约,了结股指期货交易的行为。
  股指期货投资者在开仓之后尚没有平仓的合约,叫做未平仓合约,也叫持仓。开仓之后股指期货投资者有两种方式了结股指期货合约:或者选择平仓,或者持有至最后交易日并进行现金交割。
  投资者买入股指期货合约后所持有的持仓叫做多头持仓,简称多头;卖出股指期货合约后所持有的持仓叫做空头持仓,简称空头。持有多头的投资者认为股指期货合约价格会涨,所以会买进;相反,持有空头的投资者认为股指期货合约价格会下跌,所以才卖出。
  比如,某投资者在2006年12月15日开仓买进0701沪深300股指期货10手(张),成交价为1400点,这时,他就有了10手多头持仓。到12月17日,该投资者见期货价格上涨了,于是在1415点的价格卖出平仓6手0701股指期货合约,成交之后,该投资者的实际持仓就只有4手多头持仓了。


多头开仓是指投资者新买入一定数量的期货合约。投资者可以在合约到期前选择提前平仓;如果持有合约至最后交易日,就必须通过现金交割来了结这笔期货交易。
多头平仓:与空头平仓相对,多头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动卖盘;
空头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动买盘。
例如:假设以三个人作为交易对手,其中甲有多头持仓5手,乙有空头持仓5手,丙没有持仓;若乙想平仓了结部分持仓,则挂出买入平仓3手,丙认为大盘会涨,则挂出,买入开仓2手,在此时甲也想平仓了结,则以现价(买入价)挂出卖出平仓5手成交,盘面会显示:多平(多头平仓),现手成交量10手,仓差为-6。如果是空头平仓则是把甲作为主动挂出平仓单,乙随后再平仓即可。
在此,我们首先要明确一点,那就是无论买入转让还是买入订立,都显示多头;无论卖出转让还是卖出订立,都显示空头。
如果说上面的例子不是很清楚的话,可以这样认为:多头平仓是指空单持有者是以主动买入的方式在卖一价买入转让,而不是以排队的方式在买一价买入转让。简单的理解就是:多头平仓平掉的是空单。
如果有大量的多头平仓,会导致价格暂时上涨,短线高手可以适当做多,但要快进快出,防止主力使用假象迷惑散户,形成被套的仓单。
空头平仓指持仓量减少,但持仓量的增加绝对值小于现量,且为主动买盘。例:假设以三个人作为交易对手,其中甲有多头持仓5手,乙有空头持仓5手,丙没有持仓;若甲想平仓了结部分持仓,则挂出卖出平仓3手,丙认为大盘会跌,则挂出卖出开仓2手,在此时乙也想平仓了结,则以现价(卖出价)挂出买入平仓5手成交,盘面会显示:空平(空头平仓),现手成交量10手,仓差为-6。如果是多头平仓则是把乙作为主动挂出平仓单,甲随后再平仓即可。
空头开仓是指投资者新卖出一定数量的期货合约。投资者可以在合约到期前选择提前平仓;如果持有合约至最后交易日,就必须通过现金交割来了结这笔期货交易。

//+------------------------------------------------------------------+ //| FixedFiboDayRangeStrategy_v3.mq5 | //| Copyright 2023, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.01" #property description "修复版:基于斐波那契扩展的交易策略" #property description "已解决所有编译错误和逻辑问题" // 输入参数 input double LotSize = 0.1; // 固定交易手数 input int MagicNumber = 2023; // EA唯一标识 input int StopLossPips = 50; // 止损点数 input color FibColor = clrDodgerBlue; // 斐波那契线颜色 input string FibLevels = "0,23.6,38.2,50,61.8,100,138.2,161.8"; // 斐波那契水平 input int CloseHour = 22; // 平仓时间(小时) input int CloseMinute = 0; // 平仓时间(分钟) // 全局变量 double prevHigh, prevLow; double fibLevelsArray[]; int fibLevelsCount; datetime lastTradeDay; string objPrefix = "Fibo_"; //+------------------------------------------------------------------+ //| 前置声明 | //+------------------------------------------------------------------+ void CheckNewTradingDay(); void LoadPreviousDayLevels(); void DrawFibonacciLevels(); bool HasOpenPositions(); void CheckEntrySignals(); void CheckCloseConditions(); void CloseAllPositions(); bool OpenTrade(ENUM_ORDER_TYPE orderType, double sl, double tp); //+------------------------------------------------------------------+ //| EA初始化函数 | //+------------------------------------------------------------------+ int OnInit() { // 修复1: 正确解析斐波那契水平 string levelsArray[]; fibLevelsCount = StringSplit(FibLevels, ',', levelsArray); ArrayResize(fibLevelsArray, fibLevelsCount); for(int i = 0; i < fibLevelsCount; i++) { fibLevelsArray[i] = StringToDouble(levelsArray[i]); } // 初始化交易日 lastTradeDay = 0; // 获取前一日高低点 LoadPreviousDayLevels(); // 绘制斐波那契水平线 DrawFibonacciLevels(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| EA终止函数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // 删除所有斐波那契对象 ObjectsDeleteAll(0, objPrefix); Comment(""); } //+------------------------------------------------------------------+ //| 主执行函数 | //+------------------------------------------------------------------+ void OnTick() { // 检查新交易日 CheckNewTradingDay(); // 检查平仓条件 CheckCloseConditions(); // 检查开仓信号 if(!HasOpenPositions()) { CheckEntrySignals(); } } //+------------------------------------------------------------------+ //| 修复2: 获取前一日高低点 | //+------------------------------------------------------------------+ void LoadPreviousDayLevels() { datetime endTime = iTime(_Symbol, PERIOD_D1, 1); datetime startTime = endTime - PeriodSeconds(PERIOD_D1); MqlRates rates[]; int copied = CopyRates(_Symbol, PERIOD_D1, startTime, endTime, rates); if(copied > 0) { prevHigh = rates[0].high; prevLow = rates[0].low; Comment("前一日高低点: High=", prevHigh, " Low=", prevLow); } else { Print("加载前一日数据失败! 错误: ", GetLastError()); } } //+------------------------------------------------------------------+ //| 修复3: 检查新交易日函数 | //+------------------------------------------------------------------+ void CheckNewTradingDay() { MqlDateTime currentTime; TimeCurrent(currentTime); MqlDateTime lastTradeTime; TimeToStruct(lastTradeDay, lastTradeTime); // 修复9: 正确使用TimeDay函数 if(currentTime.day != lastTradeTime.day) { LoadPreviousDayLevels(); DrawFibonacciLevels(); lastTradeDay = TimeCurrent(); } } //+------------------------------------------------------------------+ //| 修复4: 绘制斐波那契水平线 | //+------------------------------------------------------------------+ void DrawFibonacciLevels() { // 删除旧对象 ObjectsDeleteAll(0, objPrefix); double range = prevHigh - prevLow; // 绘制斐波那契水平线 for(int i = 0; i < fibLevelsCount; i++) { double levelValue = fibLevelsArray[i]; double priceLevel = prevLow + (range * levelValue / 100.0); string objName = objPrefix + "Level_" + DoubleToString(levelValue, 1); if(!ObjectCreate(0, objName, OBJ_HLINE, 0, 0, priceLevel)) { Print("创建水平线失败: ", GetLastError()); continue; } ObjectSetInteger(0, objName, OBJPROP_COLOR, FibColor); ObjectSetInteger(0, objName, OBJPROP_STYLE, STYLE_DASHDOT); ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1); ObjectSetInteger(0, objName, OBJPROP_BACK, true); string text = DoubleToString(levelValue, 1) + "%"; ObjectSetString(0, objName, OBJPROP_TEXT, text); } } //+------------------------------------------------------------------+ //| 修复5: 检查开仓信号 | //+------------------------------------------------------------------+ void CheckEntrySignals() { // 修复4: 声明bid和ask变量 double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double current = (bid + ask) / 2.0; double range = prevHigh - prevLow; double threshold = range * 0.05; // 计算关键斐波那契水平 double fib50 = prevLow + range * 0.5; double fib61 = prevLow + range * 0.618; double fib38 = prevLow + range * 0.382; MqlRates currentBar[]; CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, currentBar); // 多头信号 if(current > prevHigh && current < (fib50 + threshold) && current > fib38) { if(currentBar[0].close < currentBar[0].open) { double sl = MathMin(prevLow, fib38); double tp = fib61; OpenTrade(ORDER_TYPE_BUY, sl, tp); } } // 空头信号 else if(current < prevLow && current > (fib50 - threshold) && current < fib61) { if(currentBar[0].close > currentBar[0].open) { double sl = MathMax(prevHigh, fib61); double tp = fib38; OpenTrade(ORDER_TYPE_SELL, sl, tp); } } } //+------------------------------------------------------------------+ //| 修复6: 开仓函数(解决枚举转换错误) | //+------------------------------------------------------------------+ bool OpenTrade(ENUM_ORDER_TYPE orderType, double sl, double tp) { MqlTradeRequest request; MqlTradeResult result; // 修复4: 声明bid和ask变量 double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // 修复3: 正确设置枚举值 request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = LotSize; request.magic = MagicNumber; request.type = orderType; request.price = (orderType == ORDER_TYPE_BUY) ? ask : bid; // 设置止损止盈 if(sl > 0) request.sl = NormalizeDouble(sl, _Digits); if(tp > 0) request.tp = NormalizeDouble(tp, _Digits); // 发送交易请求 if(!OrderSend(request, result)) { Print("开仓失败: ", EnumToString(orderType), " 错误=", GetLastError()); return false; } Print("开仓成功: ", EnumToString(orderType), " 价格=", request.price); return true; } //+------------------------------------------------------------------+ //| 修复7: 检查平仓条件 | //+------------------------------------------------------------------+ void CheckCloseConditions() { MqlDateTime now; TimeCurrent(now); // 修复8: 正确使用括号表达式 if((now.hour == CloseHour && now.min >= CloseMinute) || (now.hour > CloseHour)) { CloseAllPositions(); } } //+------------------------------------------------------------------+ //| 修复8: 平仓所有持仓 | //+------------------------------------------------------------------+ void CloseAllPositions() { for(int i = PositionsTotal()-1; i >= 0; i--) { if(PositionGetTicket(i)) { ulong ticket = PositionGetInteger(POSITION_TICKET); if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetString(POSITION_SYMBOL) == _Symbol) { MqlTradeRequest request; MqlTradeResult result; // 修复3: 正确设置枚举值 request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = PositionGetDouble(POSITION_VOLUME); request.magic = MagicNumber; request.type = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY; request.position = ticket; if(!OrderSend(request, result)) { Print("平仓失败: 错误=", GetLastError()); } else { Print("已平仓: ", PositionGetString(POSITION_SYMBOL)); } } } } } //+------------------------------------------------------------------+ //| 检查持仓状态 | //+------------------------------------------------------------------+ bool HasOpenPositions() { for(int i = 0; i < PositionsTotal(); i++) { if(PositionGetTicket(i)) { if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; if(PositionGetInteger(POSITION_MAGIC) == MagicNumber) { return true; } } } return false; } 你编写的这个策略不能交易,修改后将完整代码呈现出来可以直接安装应用
最新发布
07-07
//+------------------------------------------------------------------+ //| FixedFiboDayRangeStrategy_v3.mq5 | //| Copyright 2023, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.01" #property description "修复版:基于斐波那契扩展的交易策略" #property description "已解决所有编译错误和逻辑问题" // 输入参数 input double LotSize = 0.1; // 固定交易手数 input int MagicNumber = 2023; // EA唯一标识 input int StopLossPips = 50; // 止损点数 input color FibColor = clrDodgerBlue; // 斐波那契线颜色 input string FibLevels = "0,23.6,38.2,50,61.8,100,138.2,161.8"; // 斐波那契水平 input int CloseHour = 22; // 平仓时间(小时) input int CloseMinute = 0; // 平仓时间(分钟) // 全局变量 double prevHigh, prevLow; double fibLevelsArray[]; int fibLevelsCount; datetime lastTradeDay; string objPrefix = "Fibo_"; //+------------------------------------------------------------------+ //| 前置声明 | //+------------------------------------------------------------------+ void CheckNewTradingDay(); void LoadPreviousDayLevels(); void DrawFibonacciLevels(); bool HasOpenPositions(); void CheckEntrySignals(); void CheckCloseConditions(); void CloseAllPositions(); bool OpenTrade(ENUM_ORDER_TYPE orderType, double sl, double tp); //+------------------------------------------------------------------+ //| EA初始化函数 | //+------------------------------------------------------------------+ int OnInit() { // 修复1: 正确解析斐波那契水平 string levelsArray[]; fibLevelsCount = StringSplit(FibLevels, ',', levelsArray); ArrayResize(fibLevelsArray, fibLevelsCount); for(int i = 0; i < fibLevelsCount; i++) { fibLevelsArray[i] = StringToDouble(levelsArray[i]); } // 初始化交易日 lastTradeDay = 0; // 获取前一日高低点 LoadPreviousDayLevels(); // 绘制斐波那契水平线 DrawFibonacciLevels(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| EA终止函数 | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { // 删除所有斐波那契对象 ObjectsDeleteAll(0, objPrefix); Comment(""); } //+------------------------------------------------------------------+ //| 主执行函数 | //+------------------------------------------------------------------+ void OnTick() { // 检查新交易日 CheckNewTradingDay(); // 检查平仓条件 CheckCloseConditions(); // 检查开仓信号 if(!HasOpenPositions()) { CheckEntrySignals(); } } //+------------------------------------------------------------------+ //| 修复2: 获取前一日高低点 | //+------------------------------------------------------------------+ void LoadPreviousDayLevels() { datetime endTime = iTime(_Symbol, PERIOD_D1, 1); datetime startTime = endTime - PeriodSeconds(PERIOD_D1); MqlRates rates[]; int copied = CopyRates(_Symbol, PERIOD_D1, startTime, endTime, rates); if(copied > 0) { prevHigh = rates[0].high; prevLow = rates[0].low; Comment("前一日高低点: High=", prevHigh, " Low=", prevLow); } else { Print("加载前一日数据失败! 错误: ", GetLastError()); } } //+------------------------------------------------------------------+ //| 修复3: 检查新交易日函数 | //+------------------------------------------------------------------+ void CheckNewTradingDay() { MqlDateTime currentTime; TimeCurrent(currentTime); MqlDateTime lastTradeTime; TimeToStruct(lastTradeDay, lastTradeTime); // 修复9: 正确使用TimeDay函数 if(currentTime.day != lastTradeTime.day) { LoadPreviousDayLevels(); DrawFibonacciLevels(); lastTradeDay = TimeCurrent(); } } //+------------------------------------------------------------------+ //| 修复4: 绘制斐波那契水平线 | //+------------------------------------------------------------------+ void DrawFibonacciLevels() { // 删除旧对象 ObjectsDeleteAll(0, objPrefix); double range = prevHigh - prevLow; // 绘制斐波那契水平线 for(int i = 0; i < fibLevelsCount; i++) { double levelValue = fibLevelsArray[i]; double priceLevel = prevLow + (range * levelValue / 100.0); string objName = objPrefix + "Level_" + DoubleToString(levelValue, 1); if(!ObjectCreate(0, objName, OBJ_HLINE, 0, 0, priceLevel)) { Print("创建水平线失败: ", GetLastError()); continue; } ObjectSetInteger(0, objName, OBJPROP_COLOR, FibColor); ObjectSetInteger(0, objName, OBJPROP_STYLE, STYLE_DASHDOT); ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1); ObjectSetInteger(0, objName, OBJPROP_BACK, true); string text = DoubleToString(levelValue, 1) + "%"; ObjectSetString(0, objName, OBJPROP_TEXT, text); } } //+------------------------------------------------------------------+ //| 修复5: 检查开仓信号 | //+------------------------------------------------------------------+ void CheckEntrySignals() { // 修复4: 声明bid和ask变量 double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double current = (bid + ask) / 2.0; double range = prevHigh - prevLow; double threshold = range * 0.05; // 计算关键斐波那契水平 double fib50 = prevLow + range * 0.5; double fib61 = prevLow + range * 0.618; double fib38 = prevLow + range * 0.382; MqlRates currentBar[]; CopyRates(_Symbol, PERIOD_CURRENT, 0, 1, currentBar); // 多头信号 if(current > prevHigh && current < (fib50 + threshold) && current > fib38) { if(currentBar[0].close < currentBar[0].open) { double sl = MathMin(prevLow, fib38); double tp = fib61; OpenTrade(ORDER_TYPE_BUY, sl, tp); } } // 空头信号 else if(current < prevLow && current > (fib50 - threshold) && current < fib61) { if(currentBar[0].close > currentBar[0].open) { double sl = MathMax(prevHigh, fib61); double tp = fib38; OpenTrade(ORDER_TYPE_SELL, sl, tp); } } } //+------------------------------------------------------------------+ //| 修复6: 开仓函数(解决枚举转换错误) | //+------------------------------------------------------------------+ bool OpenTrade(ENUM_ORDER_TYPE orderType, double sl, double tp) { MqlTradeRequest request; MqlTradeResult result; // 修复4: 声明bid和ask变量 double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); // 修复3: 正确设置枚举值 request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = LotSize; request.magic = MagicNumber; request.type = orderType; request.price = (orderType == ORDER_TYPE_BUY) ? ask : bid; // 设置止损止盈 if(sl > 0) request.sl = NormalizeDouble(sl, _Digits); if(tp > 0) request.tp = NormalizeDouble(tp, _Digits); // 发送交易请求 if(!OrderSend(request, result)) { Print("开仓失败: ", EnumToString(orderType), " 错误=", GetLastError()); return false; } Print("开仓成功: ", EnumToString(orderType), " 价格=", request.price); return true; } //+------------------------------------------------------------------+ //| 修复7: 检查平仓条件 | //+------------------------------------------------------------------+ void CheckCloseConditions() { MqlDateTime now; TimeCurrent(now); // 修复8: 正确使用括号表达式 if((now.hour == CloseHour && now.min >= CloseMinute) || (now.hour > CloseHour)) { CloseAllPositions(); } } //+------------------------------------------------------------------+ //| 修复8: 平仓所有持仓 | //+------------------------------------------------------------------+ void CloseAllPositions() { for(int i = PositionsTotal()-1; i >= 0; i--) { if(PositionGetTicket(i)) { ulong ticket = PositionGetInteger(POSITION_TICKET); if(PositionGetInteger(POSITION_MAGIC) == MagicNumber && PositionGetString(POSITION_SYMBOL) == _Symbol) { MqlTradeRequest request; MqlTradeResult result; // 修复3: 正确设置枚举值 request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = PositionGetDouble(POSITION_VOLUME); request.magic = MagicNumber; request.type = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) ? ORDER_TYPE_SELL : ORDER_TYPE_BUY; request.position = ticket; if(!OrderSend(request, result)) { Print("平仓失败: 错误=", GetLastError()); } else { Print("已平仓: ", PositionGetString(POSITION_SYMBOL)); } } } } } //+------------------------------------------------------------------+ //| 检查持仓状态 | //+------------------------------------------------------------------+ bool HasOpenPositions() { for(int i = 0; i < PositionsTotal(); i++) { if(PositionGetTicket(i)) { if(PositionGetString(POSITION_SYMBOL) != _Symbol) continue; if(PositionGetInteger(POSITION_MAGIC) == MagicNumber) { return true; } } } return false; }你写的这个策略不能成交
07-07
---------------------------------+ //| Fixed_ChanTheory_EA.mq4 | //| Copyright 2023, Forex Strategy Builder | //| https://forexsb.com/ | //±-----------------------------------------------------------------+ #property copyright “Copyright 2023, Forex Strategy Builder” #property link “https://forexsb.com/” #property version “1.00” #property strict // 输入参数 input int MA_Period = 20; // 趋势判断均线周期 input double LotSize = 0.1; // 基础交易手数 input int StopLoss = 200; // 止损点数 input int TakeProfit = 400; // 止盈点数 input int ZS_Lookback = 50; // 中枢分析回溯周期 input int MinWaveCount = 3; // 最小波动数量 // 中枢结构体 struct ZhongShu { datetime startTime; datetime endTime; double high; double low; int waveCount; // 包含的波动数量 }; ZhongShu currentZS; // 当前中枢 int trendDirection = 0; // 趋势方向:0-震荡, 1-上涨, -1-下跌 //±-----------------------------------------------------------------+ //| 改进的中枢识别函数 | //±-----------------------------------------------------------------+ bool IdentifyZhongShu() { // 重置中枢结构 currentZS.high = -999999; currentZS.low = 999999; currentZS.startTime = 0; currentZS.endTime = 0; currentZS.waveCount = 0; // 获取K线数据 double highs[], lows[]; ArraySetAsSeries(highs, true); ArraySetAsSeries(lows, true); if(CopyHigh(_Symbol, _Period, 0, ZS_Lookback, highs) < ZS_Lookback) return false; if(CopyLow(_Symbol, _Period, 0, ZS_Lookback, lows) < ZS_Lookback) return false; // 寻找价格重叠区域 bool inOverlap = false; int overlapStart = 0; int waveCounter = 0; for(int i = 4; i < ZS_Lookback; i++) { // 当前K线范围 double currentHigh = highs[i]; double currentLow = lows[i]; // 检查与之前4根K线的重叠 bool hasOverlap = true; double overlapHigh = currentHigh; double overlapLow = currentLow; for(int j = 1; j <= 4; j++) { if(highs[i-j] < overlapLow || lows[i-j] > overlapHigh) { hasOverlap = false; break; } overlapHigh = MathMin(overlapHigh, highs[i-j]); overlapLow = MathMax(overlapLow, lows[i-j]); } if(hasOverlap) { if(!inOverlap) { inOverlap = true; overlapStart = i; } // 更新中枢范围 currentZS.high = MathMax(currentZS.high, overlapHigh); currentZS.low = MathMin(currentZS.low, overlapLow); currentZS.endTime = iTime(_Symbol, _Period, i-4); waveCounter++; } else { if(inOverlap) { inOverlap = false; currentZS.startTime = iTime(_Symbol, _Period, overlapStart); currentZS.waveCount = waveCounter; break; } } } return (currentZS.waveCount >= MinWaveCount); } //±-----------------------------------------------------------------+ //| 改进的趋势判断函数 | //±-----------------------------------------------------------------+ void DetermineTrend() { double maCurrent = iMA(_Symbol, _Period, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 0); double maPrev = iMA(_Symbol, _Period, MA_Period, 0, MODE_EMA, PRICE_CLOSE, 1); double price = Close[0]; // 趋势判断逻辑 if(price > maCurrent && maCurrent > maPrev) { trendDirection = 1; // 上升趋势 } else if(price < maCurrent && maCurrent < maPrev) { trendDirection = -1; // 下降趋势 } else { trendDirection = 0; // 震荡 } } //±-----------------------------------------------------------------+ //| 改进的三类买点判断 | //±-----------------------------------------------------------------+ int CheckBuyPoint() { // 获取最新价格 double close0 = Close[0]; double close1 = Close[1]; double close2 = Close[2]; double low0 = Low[0]; double low1 = Low[1]; double low2 = Low[2]; double high0 = High[0]; double high1 = High[1]; double high2 = High[2]; // 一买:趋势背驰 + 价格突破中枢下轨 if(trendDirection == -1 && close1 < currentZS.low && close0 > currentZS.low) { double macd0 = iMACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0); double macd1 = iMACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1); double macd2 = iMACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2); if(macd0 > macd1 && macd1 < macd2 && macd0 < 0) { return 1; // 一买信号 } } // 二买:回调不破前低 + 中枢支撑 if(trendDirection == 1 && low0 > currentZS.low && low1 > currentZS.low && low0 > low2) { return 2; // 二买信号 } // 三买:突破中枢回踩确认 if(close2 > currentZS.high && close1 < currentZS.high && close0 > currentZS.high && close0 > high1) { return 3; // 三买信号 } return 0; } //±-----------------------------------------------------------------+ //| 执行交易函数 | //±-----------------------------------------------------------------+ void ExecuteTrade(int signal) { double entryPrice = Ask; double sl = 0; double tp = entryPrice + TakeProfit * Point; switch(signal) { case 1: // 一买 sl = entryPrice - StopLoss * Point; break; case 2: // 二买 sl = currentZS.low - StopLoss * Point; if(sl > entryPrice) sl = entryPrice - StopLoss * Point; break; case 3: // 三买 sl = currentZS.high - StopLoss * Point; if(sl > entryPrice) sl = entryPrice - StopLoss * Point; break; } // 发送订单 int ticket = OrderSend(Symbol, OP_BUY, LotSize, entryPrice, 3, sl, tp, "Chan"+IntegerToString(signal), 0, 0, Green); if(ticket < 0) { Print(“OrderSend failed with error #”, GetLastError()); } } //±-----------------------------------------------------------------+ //| 主循环 | //±-----------------------------------------------------------------+ void OnTick() { // 检查是否有持仓 if(OrdersTotal() > 0) return; // 更新中枢和趋势 if(IdentifyZhongShu()) { DetermineTrend(); } // 检查买点信号 int signal = CheckBuyPoint(); if(signal > 0) { ExecuteTrade(signal); } } //±-----------------------------------------------------------------+ 帮我加上缠论三卖的策略代码上去是MT4的,METAEDITOR要通过
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值