设为首页 收藏本站 切换语言

马丁怎么才能循环起来,每一轮的逻辑都相符呢,求赐教

| 发表于 2024-11-20 09:19:22 | 显示全部楼层 |复制链接
预期是做一个马丁,每轮循环下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  [下载]

评分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN    参与人数:0    我的评分:未评 下载时遇到问题?
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)