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

均线趋势交易,带移动止损功能

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-27 23:22:00 | 显示全部楼层 |阅读模式
#property copyright "dzsq"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

using System.ComponentModel;
using System.Drawing;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System;

extern int longMa = 20;   //长均线
extern int shortMa = 10;  //短均线
extern int callBachMa = 30;  //回踩线

extern int stop = 300; //止损
extern int limit = 900; //止盈
extern double lots = 1;  //手数
extern double movestop = 500; //移动止损
extern int magic = 12345;

bool isCrossBuy = false; //是否交叉
bool isCrossSell = false;
//是否会调到支撑线
bool isSellCallback = false;
bool isBuyCallback = false;
//是否开仓
bool isBuyOpened = false;
bool isSellOpened = false;

datetime buytime = 0;
datetime selltime = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    //---

    //---
    return (INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    //---

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    //向下取整
    //lots = MathFloor(AccountBalance()/10000);
    //获取所有的均线价格,长期,短期,回调
    double longmaPrice1 = iMA(NULL, 0, longMa, 0, MODE_SMA, PRICE_CLOSE, 1);
    double longmaPrice2 = iMA(NULL, 0, longMa, 0, MODE_SMA, PRICE_CLOSE, 2);
    double shortmaPrice1 = iMA(NULL, 0, shortMa, 0, MODE_SMA, PRICE_CLOSE, 1);
    double shortmaPrice2 = iMA(NULL, 0, shortMa, 0, MODE_SMA, PRICE_CLOSE, 2);
    double callBackPrice = iMA(NULL, 0, callBachMa, 0, MODE_SMA, PRICE_CLOSE, 0);

    //均线交叉多头
    if (shortmaPrice1 > longmaPrice1 && shortmaPrice2 < longmaPrice2)
    {
        isCrossBuy = true;
        isCrossSell = false;
        isSellOpened = false;
        isSellCallback = false;
        closesell(Symbol() + "sell", magic);
    }

    //均线交叉空头
    if (shortmaPrice1 < longmaPrice1 && shortmaPrice2 > longmaPrice2)
    {
        isCrossBuy = false;
        isCrossSell = true;
        isBuyOpened = false;
        isBuyCallback = false;
        closebuy(Symbol() + "buy", magic);
    }

    double lowPrice = Low[0];
    double highPrice = High[0];
    double openPrice = Open[0];
    double closePrice = Close[0];
    //符合做多的条件
    if (!isBuyOpened && isCrossBuy && lowPrice < callBackPrice)
    {
        //time[0]  表示当前时间
        if (buytime != Time[0])
        {   //解决当前K线重复下单的问题
            if (buy(lots, stop, limit, Symbol() + "buy", magic))
            {
                buytime = Time[0];
                isBuyOpened = true;
            }

        }
    }
    //符合做空的条件
    if (!isSellOpened && isCrossSell && highPrice > callBackPrice)
    {
        //time[0]  表示当前时间
        if (selltime != Time[0])
        {   //解决当前K线重复下单的问题
            if (sell(lots, stop, limit, Symbol() + "sell", magic))
            {

                selltime = Time[0];
                isSellOpened = true;

            }

        }
    }
    yidongzhisun();
}

//下单函数 针对一个单子
int buy(double lots, double stop, double limit, string comm, int buymagic)
{  //手数,止损,止盈,注释,magic
    int ticket = 0;   //订单号
    bool zhaodan = false;  //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
    for (int i = 0; i < OrdersTotal(); i++)
    {

        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
        {
            string zhushi = OrderComment();
            int magicNumber = OrderMagicNumber();

            if (OrderSymbol() == Symbol() && OrderType() == OP_BUY && zhushi == comm && magicNumber == buymagic)
            {
                zhaodan = true;
                break;
            }
        }
    }
    if (zhaodan == false)
    {
        if (stop != 0 && limit == 0)
        {
            ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 50, Ask - stop * Point, 0, comm, buymagic, 0, White);
        }
        if (stop == 0 && limit != 0)
            ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 50, 0, Ask + limit * Point, comm, buymagic, 0, White);
        if (stop == 0 && limit == 0)
            ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 50, 0, 0, comm, buymagic, 0, White);
        if (stop != 0 && limit != 0)
            ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 50, Ask - stop * Point, Ask + limit * Point, comm, buymagic, 0, White);
    }
    return (ticket);

}

//下单函数 针对一个单子
int sell(double lots, double stop, double limit, string comm, int sellmagic)
{  //手数,止损,止盈,注释,magic
    int ticket = 0;   //订单号
    bool zhaodan = false;  //判断有没有重复下单,其实上面已经写过了,这里不写也没关系
    for (int i = 0; i < OrdersTotal(); i++)
    {

        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
        {
            string zhushi = OrderComment();
            int magicNumber = OrderMagicNumber();

            if (OrderSymbol() == Symbol() && OrderType() == OP_SELL && zhushi == comm && magicNumber == sellmagic)
            {
                zhaodan = true;
                break;
            }
        }
    }
    if (zhaodan == false)
    {
        if (stop != 0 && limit == 0)
        {
            ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 50, Bid + stop * Point, 0, comm, sellmagic, 0, White);
        }
        if (stop == 0 && limit != 0)
            ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 50, 0, Bid - limit * Point, comm, sellmagic, 0, White);
        if (stop == 0 && limit == 0)
            ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 50, 0, 0, comm, sellmagic, 0, White);
        if (stop != 0 && limit != 0)
            ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 50, Bid + stop * Point, Bid - limit * Point, comm, sellmagic, 0, White);
    }
    return (ticket);
}
// 平货币
void closebuy(string comm, int magic)
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
        {

            if (OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderComment() == comm && OrderMagicNumber() == magic)
            {
                OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 300, Green);
            }
        }
    }

}
// 平货币
void closesell(string comm, int magic)
{
    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
        {

            if (OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderComment() == comm && OrderMagicNumber() == magic)
            {
                OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 300, Green);
            }
        }
    }

}
//设置移动止损
void yidongzhisun()
{
    for (int i = 0; i < OrdersTotal(); i++)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
        {

            if (OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == magic)
            {

                if ((Bid - OrderOpenPrice()) >= Point * movestop)
                {

                    if (OrderStopLoss() < (Bid - Point * movestop) || OrderStopLoss() == 0)
                    {
                        OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * movestop, OrderTakeProfit(), 0, Green);
                    }
                }
            }
            if (OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == magic)
            {

                if ((OrderOpenPrice() - Ask) >= Point * movestop)
                {

                    if (OrderStopLoss() < (Ask + Point * movestop) || OrderStopLoss() == 0)
                    {
                        OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * movestop, OrderTakeProfit(), 0, Green);
                    }
                }
            }
        }
    }
}

//+------------------------------------------------------------------+

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-10-10 05:23 , Processed in 0.099348 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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