智能交易网,程序化交易,自动交易,量化交易

 找回密码
 注册

QQ登录

只需一步,快速开始

手机短信登录

参加MT4智能交易编程培训,7课免费在线试听MT4指标,EA代写,或EA指标加密账户远程验证服务 最完善商业MT4跟单系统(0.1秒极速响应不漏单)
为论坛做贡献有奖学金,奖学金可直接换真钱 扫本站微信公 众号部分视频课程指标EA免费得智能交易网MT4操盘神器,扫公众号免费得
查看: 12997|回复: 49

改进后的智能移动止损的 EA 脚本

[复制链接]
发表于 2013-10-12 03:32:36 | 显示全部楼层 |阅读模式
        普通移动止损的 EA 脚本是每次下单他都自动执行不能停止,可更改为(智能交易按键)可以手动停止他的行为的ea,可以在参数里面手动改动他的每次下单止损 。            
                           
        改进后的智能移动止损的 EA 脚本。 算法如下:

1. 检测所下单子,若单子未设置止损和止盈,则根据默认输入参数设置止损和止盈。
2. 若单子发生盈利,并达到移动止损触发线,则动态提高原有止损线,进入追踪止损状态。
3. 若单子一直盈利,止损的范围也会随着盈利的比例变大而变大。
4. 若单子盈利已经达到预期止盈目标的 75%,则动态提高止盈线,给出更多上涨空间。


#property copyright "CN.ineztia"
#property link "
extern bool g_debug = true;
extern double g_initStop = 27;
extern double g_breakEven = 20;
extern double g_stepSize = 3;
extern double g_measure = 10;
extern double g_stopMax = 200;
extern double g_profitExtendThreshold = 0.75;
extern double g_profitMax = 0; // close order if profit reaches the pre-defined max value

int doStepStop() {
    int total = OrdersTotal();
    for (int i = 0; i < total; i++) {
        if (OrderSelect(i, SELECT_BY_POS)) {
            if (OrderSymbol() != Symbol()) {
                continue;
            }
            double flag = 0;
            double price = 0; // current price
            double desiredProfit = 0;
            double realProfit = 0;
            double profitModifier = 0;
            double takeProfit = OrderTakeProfit();
            double stopLoss = OrderStopLoss();
            double stepStopTrigger = (g_breakEven + g_initStop) * Point;
            if (OrderType() == OP_BUY) {
                flag = 1;
                price = Bid;
            }    else if (OrderType() == OP_SELL) {
                flag = -1;
                price = Ask;
            } else {
                continue;
            }
            if (takeProfit <= 0) {
                takeProfit = OrderOpenPrice() + flag * (g_breakEven + g_initStop + g_stepSize) * Point;
            }
            if (stopLoss <= 0) {
                stopLoss = OrderOpenPrice() - flag * g_initStop * Point;
            }
            desiredProfit = MathAbs(takeProfit - OrderOpenPrice());
            if (desiredProfit <= Point) {
                continue;
            }
            realProfit = flag * (price - OrderOpenPrice()); // could be a negtive number!
            if (realProfit > 0) {
                if ((realProfit / desiredProfit > g_profitExtendThreshold) || (desiredProfit - realProfit < 2 * g_stepSize * Point)) {
                    // profitModifier is always a positive number
                    profitModifier = MathMax(desiredProfit / g_profitExtendThreshold + g_stepSize * Point, desiredProfit + 2 * g_stepSize * Point);
                }
                if (desiredProfit - stepStopTrigger > 0) {
                    if ((desiredProfit - realProfit > 0) && (realProfit - stepStopTrigger > 0)) {
                        double k = (desiredProfit - realProfit) / (g_measure * Point);
                        stopLoss = price - flag * (k * g_stepSize + g_initStop) * Point;
                        if (flag * (stopLoss - OrderStopLoss()) < 0 || MathAbs(stopLoss - OrderStopLoss()) < g_stepSize * Point) {
                            stopLoss = OrderStopLoss();
                        }
                    }
                }
            }
            stopLoss = NormalizeDouble(stopLoss, Digits);
            if (MathAbs(takeProfit - OrderOpenPrice()) < profitModifier) {
                if (g_profitMax > 0 && profitModifier - g_profitMax * Point > 0) {
                    profitModifier = g_profitMax * Point;
                }
                takeProfit = OrderOpenPrice() + flag * profitModifier;
            }
            takeProfit = NormalizeDouble(takeProfit, Digits);
            if (MathAbs(stopLoss - OrderStopLoss()) >= Point || MathAbs(takeProfit - OrderTakeProfit()) >= Point) {
                Print("order before modify: tk(" + OrderTicket() + "), sl(" + DoubleToStr(OrderStopLoss(), 4) + "), tp(" + DoubleToStr(OrderTakeProfit(), 4) + ")");
                OrderModify(OrderTicket(), OrderOpenPrice(), stopLoss, takeProfit, 0);
            }
        }
    }
    return(0);
}

int validateParams() {
    if (g_initStop < 0 || g_stepSize < 0 || g_measure < 0 || g_breakEven < 0) {
        Alert("g_initStop, g_stepSize, g_measure & g_breakEven can not be negtive.");
        return(-1);
    }
    if (g_measure <= g_stepSize) {
        Alert("g_measure must be greater than g_stepSize.");
        return(-1);
    }
    if (g_profitExtendThreshold <= 0 || g_profitExtendThreshold >= 1) {
        Alert("range of g_extendProfitThreshold is (0, 1).");
        return(-1);
    }
    return(0);
}

int init() {
    doStepStop();
    return(0);
}

int deinit() {
    return(0);
}

int start() {
    if (0 == validateParams()) {
        doStepStop();
    }
    return(0);
}
回复

使用道具 举报

发表于 2015-1-25 22:04:34 | 显示全部楼层
网上下的吧{:soso_e110:}
回复 支持 1 反对 0

使用道具 举报

发表于 2013-10-12 17:42:44 | 显示全部楼层
敢问大侠,这到底是EA,还是脚本~~?    你这 “EA 脚本”有点儿难……
回复 支持 反对

使用道具 举报

发表于 2013-10-13 09:03:43 | 显示全部楼层
有错误,不能通过
回复 支持 反对

使用道具 举报

发表于 2013-12-28 15:00:29 | 显示全部楼层
这个怎么学习啊
回复 支持 反对

使用道具 举报

发表于 2014-3-9 12:26:17 | 显示全部楼层
没有学过编程,还真看不懂呀,就是不改什么也不知道如何做一个EA呀,看来要多看看教程学下咯
回复 支持 反对

使用道具 举报

发表于 2014-5-8 13:42:11 | 显示全部楼层
编程这条路貌似有点遥远啊,不知道现在学晚不
回复 支持 反对

使用道具 举报

发表于 2015-1-19 02:25:03 | 显示全部楼层
你实践检验过吗?能实现预期的功能吗?大侠
回复 支持 反对

使用道具 举报

发表于 2015-1-29 21:15:00 | 显示全部楼层
思路很不错啊不知道能不能行
回复 支持 反对

使用道具 举报

发表于 2015-4-17 14:13:27 | 显示全部楼层
看不太懂,不过也很感谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|sitemap|智能交易网,程序化交易,自动交易,量化交易 ( 苏ICP备08108698号,苏州智德金网络科技股份有限公司版权所有 )

GMT+8, 2019-10-23 19:48 , Processed in 0.128019 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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