找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 14|回复: 0

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

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-24 23:13:00 | 显示全部楼层 |阅读模式
预期是做一个马丁,每轮循环下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 = InitialLotSize; // 设置每单的手数为初始手数

        tradeProfits = 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); // 打印成功信息

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-12 06:25 , Processed in 0.115584 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表