马丁怎么才能循环起来,每一轮的逻辑都相符呢,求赐教
预期是做一个马丁,每轮循环下10单,每次都是上单结束以后开始下一单;编写的代码第一轮可以很好的执行,但到了第二轮及以后,变成了每次都一次性下10单了,没有遵循第一轮的逻辑。这是什么原因?请大神帮忙分析解决下,谢谢。代码如下:
input double InitialLotSize = 0.01; // 初始开单手数
input int StopLossPoints = 600; // 止损点数
input int TakeProfitPoints = 600; // 止盈点数
input int BuyMagic = 101; // 买单的magic码
input int MaxTrades = 10; // 每轮最大交易次数
double lotSizes[10]; // 手数数组,最多10单
double tradeProfits[10]; // 每单的盈利情况
int totalTrades = 0; // 当前交易的总数
bool isFirstTrade = true; // 标记是否是第一单
bool isNewDay = true; // 标记是否是新的一天
datetime lastOrderTime; // 记录最后开单的时间
int OnInit() // 初始化函数
{
for (int i = 0; i < MaxTrades; i++) // 循环初始化手数和盈利情况
{
lotSizes[i] = InitialLotSize; // 设置每单的手数为初始手数
tradeProfits[i] = 0.0; // 初始化每单的盈利情况为0
}
return INIT_SUCCEEDED; // 返回初始化成功
}
void OnTick() // 每个tick调用的函数
{
if (TimeDay(TimeCurrent()) != TimeDay(lastOrderTime)) // 检查是否是新的一天
{
isNewDay = true; // 设置为新的一天
totalTrades = 0; // 重置交易计数
isFirstTrade = true; // 准备开第一单
}
if (isFirstTrade && TimeHour(TimeCurrent()) == 7 && TimeMinute(TimeCurrent()) == 0 && OrdersTotal() == 0) // 检查是否符合开第一单的条件
{
OpenBuyOrder(InitialLotSize); // 开第一单
isFirstTrade = false; // 设置为非第一单
totalTrades++; // 增加交易计数
lastOrderTime = TimeCurrent(); // 记录开单时间
return; // 结束当前tick的处理
}
if (CheckLastTradeClosed()) // 检查是否有订单关闭
{
if (totalTrades < MaxTrades) // 如果交易次数未超过最大次数
{
double lotSize = CalculateLotSize(totalTrades); // 计算当前手数
OpenBuyOrder(lotSize); // 开新单
totalTrades++; // 增加交易计数
}
else
{
isFirstTrade = true; // 达到最大交易次数,准备下一轮
}
}
}
bool CheckLastTradeClosed() // 检查最后一单是否已经关闭
{
if (totalTrades == 0) // 如果没有任何历史订单
return false; // 返回false
if (OrderSelect(totalTrades - 1, SELECT_BY_POS, MODE_HISTORY)) // 选择最后一笔交易
{
if (OrderType() == OP_BUY && OrderMagicNumber() == BuyMagic) // 检查是否为买单且magic码匹配
{
tradeProfits[totalTrades - 1] = OrderProfit(); // 记录最后一笔交易的盈利情况
return true; // 返回true,表示订单已关闭
}
}
return false; // 返回false,表示没有已关闭的订单
}
double CalculateLotSize(int tradeIndex) // 计算每单的手数
{
if (tradeIndex == 0) // 如果是第一单
return InitialLotSize; // 返回初始手数
double lotSize = lotSizes[tradeIndex - 1]; // 默认手数为上一单手数
bool lastTradeProfit = tradeProfits[tradeIndex - 1] > 0; // 检查上一单是否盈利
if (lastTradeProfit) // 如果上一单盈利
lotSize = InitialLotSize; // 手数重置为初始手数
else
lotSize *= 2; // 如果亏损,手数翻倍
lotSizes[tradeIndex] = lotSize; // 存储当前手数
return lotSize; // 返回当前手数
}
void OpenBuyOrder(double lotSize) // 开买单
{
double price = Ask; // 当前买入价格
double sl = price - StopLossPoints * Point; // 计算止损价格
double tp = price + TakeProfitPoints * Point; // 计算止盈价格
int ticket = OrderSend(Symbol(), OP_BUY, lotSize, price, 3, sl, tp, "Buy Order", BuyMagic, 0, Blue); // 发送买单
if (ticket < 0) // 如果订单发送失败
Print("订单发送失败,错误代码:", GetLastError()); // 打印错误代码
else
Print("成功开买单,订单号:", ticket, " 手数:", lotSize); // 打印成功信息
}
|
-
-
循环.mq4
7.01 KB, 下载次数: 0, 下载积分: 活跃度 -5
[下载]
|
|
|
|