系统交易

双重止损:隐性止损与常规止损的完美结合
MetaTrader4
双重止损:隐性止损与常规止损的完美结合

在开新仓位时,交易者首先需要考虑的就是资金管理。控制风险和管理资金的一个常用方式就是为自己的仓位设定一定的止损幅度。 许多交易者认为,当他们为仓位设置止损(Stop Loss)或止盈(Take Profit),并在仓位修改窗口中输入这个价格时,券商的服务器就会在价格达到这个限制时立即平仓。但实际上,这并不完全正确。 这取决于你在券商那里开设的账户类型。在ECN账户中,当你给券商提供一个止损或止盈价格时,券商会在价格达到这个限制后,尽快以第一个可用价格平仓。如果你对此不满,可以仔细查看你的交易历史。 你会发现,有些订单的平仓价格与设定的价格不一致,导致你蒙受的损失甚至超过了预期的利润。这就是因为出现了滑点(SLIPPAGE)。 此外,一些交易者认为,止损的限制不应该准确告知券商。由此诞生了隐性止损,这个机器人正是为此而设计。从现在起,你可以同时拥有隐性和常规止损。 你可以像往常一样轻松地为你的仓位设置常规止损,无论你是使用机器人还是手动交易。 只需在一个新的独立图表(任意图表均可)上运行这个机器人来管理你的所有仓位。输入的值决定了隐性止损和常规止损之间的距离。请注意,这个值是以点(point)为单位,而不是以点差(pip)为单位。

2021.04.23
掌握超短线交易:Scalper助手v1.0让你的交易更轻松
MetaTrader4
掌握超短线交易:Scalper助手v1.0让你的交易更轻松

超短线交易的魅力 超短线交易(Scalping)是如今交易者们最为青睐的策略之一,几乎每位交易者都试过这种方式。因为超短线交易者通常每天会进行10笔以上的交易,为每一笔设置止损(Stop Loss)和获利(Take Profit)可能会显得有些繁琐。如果你在多种金融工具上进行交易,同时又希望能实现盈亏平衡,管理这些订单的工作就会变得更加乏味,且容易出错。 而且,如果你在更低的时间框架内交易,同时涉及多个货币对,那么当你离开桌子去泡杯茶时,价格可能会迅速波动,这可能会导致你错过盈亏平衡的机会。更糟糕的是,价格快速回调将盈利交易变为亏损的可能性也不容小觑。 Scalper助手的优势 使用这个专家顾问工具,你可以轻松设定止损和获利的金额。每当你开盘后,系统会自动为你设置初始值。如果价格朝着你期望的方向移动到足够的幅度,交易将变得无风险,或者实现盈亏平衡。 所有的输入值都是以点(POINT)为单位,而不是点差(PiP)。 extern double WhenToMoveToBE:你可以设定价格需要距离订单开仓点多少点,才能使这个专家顾问将订单调整为盈亏平衡。 extern double BEAmount:你可以设置止损距离开仓点的距离。 通过使用Scalper助手v1.0,超短线交易将变得更加轻松高效,让你在繁忙的交易中减少错误,提高交易的成功率!

2021.04.23
如何使用EA在MetaTrader 4中根据目标获利或止损平仓
MetaTrader4
如何使用EA在MetaTrader 4中根据目标获利或止损平仓

我们将这个EA作为一个交易工具来使用。使用此EA需要设置三个输入参数,如下所示:利润目标止损金额魔法数字extern    double         inTargetProfitMoney     = 10;       //目标利润 ($) extern    double         inCutLossMoney          = 0.0      //止损金额 ($) extern    int            inMagicNumber           = 0        //魔法数字 当这个EA被执行时,首先会调用OnInit ()函数。在这里我们将验证输入和变量的初始化。int OnInit()   { //---    if(inTargetProfitMoney <= 0)      {       Alert("输入无效");       return(INIT_PARAMETERS_INCORRECT);      }    inCutLossMoney = MathAbs(inCutLossMoney) * -1; //---    return(INIT_SUCCEEDED);   }每当价格波动(tick)时,会调用OnTick ()函数。void OnTick()   { //---    double   tFloating = 0.0;    int tOrder  = OrdersTotal();    for(int i=tOrder-1; i>=0; i--)      {       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))         {          if(OrderMagicNumber() == inMagicNumber)            {             tFloating   += OrderProfit()+OrderCommission() + OrderSwap();            }         }     }    if(tFloating >= inTargetProfitMoney || (tFloating <= inCutLossMoney && inCutLossMoney < 0))      {       fCloseAllOrders();     }   }在OnTick函数中,它会继续计算总的盈利或亏损,然后关闭所有达到目标或超过最大亏损限制的订单。void fCloseAllOrders()   {    double   priceClose = 0.0;    int tOrders = OrdersTotal();    for(int i=tOrders-1; i>=0; i--)      {       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))         {          if(OrderMagicNumber() == inMagicNumber && (OrderType() == OP_BUY || OrderType() == OP_SELL))            {             priceClose = (OrderType()==OP_BUY)?MarketInfo(OrderSymbol(), MODE_BID):MarketInfo(OrderSymbol(), MODE_ASK);             if(!OrderClose(OrderTicket(), OrderLots(), priceClose, slippage, clrGold))               {                Print("警告:平仓失败");               }            }         }     }   }想了解更多详细信息,欢迎加入我们的Telegram交流群,分享MQL4代码的学习经验。t.me/codeMQL

2021.03.31
使用Trailing Stop优化交易策略 - MetaTrader 4的实用工具
MetaTrader4
使用Trailing Stop优化交易策略 - MetaTrader 4的实用工具

在交易中,Trailing Stop(移动止损)是一个非常有用的工具,它能帮助我们自动锁定利润。通过将止损点移至盈利区域,我们可以更好地保护我们的交易。 接下来,我们将从设置输入参数开始编写代码,以下是基础代码示例: input    bool     isTrailingStop = true;  //启用移动止损 input    int      trailingStart  = 15;    //移动止损开始 (点数) input    int      trailingStep   = 5;     //移动止损步长 (点数) input    int      MagicNumber = 0;        //魔术编号 接下来是全局变量的定义: //全局变量 double   myPoint    = 0.0; 当我们运行这个EA时,OnInit() 函数会第一次被调用,在这个函数中,我们将验证并初始化输入变量: int OnInit()   {       if (isTrailingStop && trailingStart <= 0){       Alert ("参数不正确");       return(INIT_PARAMETERS_INCORRECT);    }       myPoint     = GetPipPoint(Symbol());       return(INIT_SUCCEEDED);   } 每当图表上发生价格变动(tick)时,OnTick() 函数将被执行。在这个函数中会调用 setTrailingStop() 函数: void OnTick()   { //---    setTrailingStop(MagicNumber);      } 下面是 setTrailingStop() 函数的实现: void setTrailingStop(int magicNumber=0){    if (isTrailingStop==false) return;       int      tOrder = 0;    string   pair = "";    double   sl = 0.0, tp = 0.0;       pair = Symbol();       tOrder = OrdersTotal();    for (int i=tOrder-1; i>=0; i--){       bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);       if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){          if (OrderType() == OP_BUY){             if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice()                   && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() )                 )             {                sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());                if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){                   Print ("#", OrderTicket(), " 更新止损失败");                }             }          }                   if (OrderType() == OP_SELL){             if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice()                   && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0)                )             {                sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );                if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){                   Print ("#", OrderTicket(), " 更新止损失败");                }             }          }       } //结束魔术编号判断    }//结束循环 } 我们还需要一个标准函数 GetPipPoint(): // 获取点值函数 double GetPipPoint(string pair) {    double point= 0.0;    int digits = (int) MarketInfo(pair, MODE_DIGITS);    if(digits == 2 || digits== 3) point= 0.01;    else if(digits== 4 || digits== 5) point= 0.0001;    return(point); } 如果你有任何问题,可以在评论区留言,或者加入我们的交流小组(印尼语) t.me/codeMQL。 我们还提供了 SignalForex 应用程序,欢迎大家下载并使用,助力你的交易更上一层楼! SignalForex 应用下载链接

2021.03.30
使用移动平均线交叉策略的MetaTrader 4专家顾问
MetaTrader4
使用移动平均线交叉策略的MetaTrader 4专家顾问

在今天的文章中,我们将一起创建一个基于移动平均线交叉策略的EA(专家顾问)。首先,我们需要定义输入参数。 //--- 输入参数 input    int      period_ma_fast = 8;  //快速移动平均期数 input    int      period_ma_slow = 20;  //慢速移动平均期数 input    double   takeProfit  = 20.0;  //止盈(点数) input    double   stopLoss    = 20.0;  //止损(点数) input    double   lotSize     = 0.10;  //手数 input    double   minEquity   = 100.0;  //最低资金(美元) input    int Slippage = 3;       //滑点 input    int MagicNumber = 889;  //魔术编号 接下来,我们定义全局变量。这些全局变量在整个程序中都可以被访问。 //全局变量 double   myPoint    = 0.0; int      mySlippage = 0; int      BuyTicket   = 0; int      SellTicket  = 0; 当EA被执行时,首先调用的函数是 OnInit()。这个函数通常用于验证和初始化全局变量。 int OnInit() {    //验证输入,建议始终对输入数据进行验证    if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){       Alert("警告 - 输入数据无效");       return (INIT_PARAMETERS_INCORRECT);    }       double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);    if(lotSize<min_volume)    {       string pesan =StringFormat("交易手数低于允许的最低值 %.2f",min_volume);       Alert (pesan);       return(INIT_PARAMETERS_INCORRECT);    }       myPoint = GetPipPoint(Symbol());    mySlippage = GetSlippage(Symbol(),Slippage);    return(INIT_SUCCEEDED); } 当市场价格发生变动时(即tick),将调用 OnTick() 函数并执行其中的所有指令。 在 OnTick() 函数内部,将调用其他多个函数。 首先调用 checkMinEquity() 函数来检查交易资金是否充足。如果资金大于最低要求,将进行信号变量声明,并调用 NewCandle() 函数,通知新的蜡烛形成。 接下来的 getSignal() 函数将读取两个移动平均指标的值,返回上升或下降交叉的信号信息,这将作为买入/卖出的信号。 根据信号信息,传递给 transaction() 函数来设置买入或卖出头寸。 接着调用 setTPSL() 函数,用于设置止盈和止损价格。如果资金不满足最低要求,将显示警告并终止EA。 void OnTick() {    if (cekMinEquity()){              int signal = -1;       bool isNewCandle = NewCandle(Period(), Symbol());              signal = getSignal(isNewCandle);       transaction(isNewCandle, signal);       setTPSL();                  }else{       //停止交易,因为资金不足       Print("EA将因资金不足而终止");    } } 设置止盈止损的函数 void setTPSL(){    int   tOrder = 0;    string   strMN = "", pair = "";    double sl = 0.0, tp = 0.0;       pair = Symbol();       tOrder = OrdersTotal();    for (int i=tOrder-1; i>=0; i--){       bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);       strMN = IntegerToString(OrderMagicNumber());       if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){          if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){             if (takeProfit > 0) {                tp = OrderOpenPrice() + (takeProfit * myPoint);             }else{                tp = OrderOpenPrice();             }             if (stopLoss > 0) {                sl = OrderOpenPrice() - (stopLoss * myPoint);             }else{                sl = OrderStopLoss();             }             if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){                if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){                   Print ("订单修改成功");                }             }          }          if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){             if (takeProfit > 0) {                tp = OrderOpenPrice() - (takeProfit * myPoint);             }else{                tp = OrderOpenPrice();             }             if (stopLoss > 0) {                sl = OrderOpenPrice() + (stopLoss * myPoint);             }else{                sl = OrderStopLoss();             }             if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){                if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){                   Print ("订单修改成功");                }             }          }                }//结束魔术编号和交易符号的判断    }//结束循环 } 如果你希望获得更多的交易知识和分享,欢迎加入我们的Telegram群组。 点击这里加入Telegram群组 如果你在寻找可以支持你交易的应用程序,欢迎下载我们的SignalForex应用程序,支持安卓系统。 点击这里下载SignalForex应用程序

2021.03.30
使用DeMarker指标的简单EA - 适用于MetaTrader 4的交易助手
MetaTrader4
使用DeMarker指标的简单EA - 适用于MetaTrader 4的交易助手

大家好,今天我想和大家分享一个我自己开发的非常简单的交易助手(EA),它是基于DeMarker指标的。之前我一直在考虑如何利用EA来辅助我的交易,最终我完成了这个项目,非常期待你们的反馈! 这个EA只针对单一货币对进行操作。你可以在菜单属性中设置时间框架、手数、止损和止盈等参数,非常方便。 extern ENUM_TIMEFRAMES TF  = PERIOD_CURRENT;// 选择时间框架 extern int period          = 8;// DeMarker周期 extern double lt           = 0.01;// 手数 extern int sl              = 100;// 止损 extern int tp              = 100;// 止盈 extern double OB           = 0.7;// 超卖 extern double OS           = 0.3;// 超买 extern bool OPENBAR        = false;// 在新K线开盘价交易 这里有一个小秘密,我把变量分成三部分:1. 数据 | 时间框架2. 订单3. 货币对 //+------------------------------------------------------------------+ //-- 时间框架 | 指标 double dmrk[5]; int signal  =-1;//-- 0.买 1.卖 int hold = 0; //-- 订单 int ticket  =0; double lot  =0.0; int typ     =-1; //-- 货币对 datetime t1=0; bool newbar=false; bool entry =false; //+------------------------------------------------------------------+ 在OnInit()函数中,我需要初始化DeMarker指标数组变量,并检查特定经纪商要求的最小交易手数。 //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void OnInit()   {    ArrayInitialize(dmrk,0.0);   //---       const double test_lot   = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);       if(lt<test_lot)   lt    = test_lot;   } 在OnTick()函数中,我会计算指标并判断买卖信号。 //---------------------------------------------------------------------------    signal = -1; //--------------------------------------------------------------------------- //---计算    for(int i=0; i<ArraySize(dmrk); i++)      {       dmrk[i]  =  iDeMarker(Symbol(),TF,period,i);      } //---    if(dmrk[1] > OB)      {       hold = 1;//设置      }    else       if(dmrk[1] < OS)         {          hold = -1;//设置         }       else         {          hold = 0;//重置         }    if(hold ==  1)      {       if(dmrk[0]<OB && dmrk[1]>OB)         {          signal = OP_SELL;         }      }    if(hold == -1)      {       if(dmrk[0]>OS && dmrk[1]<OS)         {         signal = OP_BUY;         }      } 要打开买卖信号... //---------------------------------------------------------------------------    if(signal != -1)       if(newbar==true)          if(entry==false)//门打开            {             //---             entry =true;//设置             //---             if(signal == OP_BUY)               {                ticket = OrderSend(Symbol(),OP_BUY,lt,Ask,(int)((Ask-Bid)/Point,                                   sl>0?Bid-sl*Point:0.0,                                   tp>0?Bid+tp*Point:0.0,                                   EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold),                                   EANumber,                                   0,                                   clrBlue);                signal=-1;                //hold =0;               }//重置             else                if(signal == OP_SELL)                  {                   ticket = OrderSend(Symbol(),OP_SELL,lt,Bid,(int)((Ask-Bid)/Point,                                      sl>0?Ask+sl*Point:0.0,                                      tp>0?Ask-tp*Point:0.0,                                      EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold),                                   EANumber,                                   0,                                   clrRed);                   signal=-1;                   }//重置信号            } 关于平仓的部分...    if(entry == true) // 平仓      {       if(OrderSelect(ticket,SELECT_BY_TICKET))         {          if(OrderCloseTime() == 0)//-- 订单仍在交易中            {             /*  待处理的平仓条件  */             //entry = false;            }          //else             if(OrderCloseTime() != 0)//--  手动平仓 2.止损止盈 3. EA平仓               {                entry = false;//重置entry               }         }      }   

2020.12.17
如何在MetaTrader 4中创建CSV文件的实用示例
MetaTrader4
如何在MetaTrader 4中创建CSV文件的实用示例

大家好,我是Lucas!今天想和大家分享一些我在交易过程中得到的经验,希望对你们有所帮助。作为一名外汇和股票市场的投资者,我自己也在编写一些交易专家顾问(EA)来辅助我的个人交易。今天分享的内容是一个示例,展示如何将订单数据写入CSV文件,方便后续分析。 这个专家顾问(EA)目前并不适合用于实际交易,它主要是用来演示如何实现这个功能。你可以在此基础上继续开发和修改,以适应你自己的交易策略。 此EA会在选定的方向上开仓,订单的关闭将通过菜单设置的止盈(TP)和止损(SL)来实现。如果“WriteCloseData”设置为真,则会在你的终端创建一个CSV文件,存储订单的数据,如方向、盈亏、价格等信息。 在策略测试器中测试这个EA时,你可以通过路径 OpenDataFolder/tester/CSVexpert/CSVexample 找到这个文件。文件夹CSVexpert会在你开始测试时自动创建,而CSVexample文件则会在其中存放所有数据。 当你将这个功能集成到自己的专家顾问中,或者在模拟/真实账户上运行时,你将通过路径 MQL4/Files/CSVexpert/CSVexample 找到这个创建的文件。你可以根据需要重命名目录和文件名,但请保持.csv格式不变。再次提醒,这只是一个示例,不建议立即用于实际交易,以免造成资金损失!

2020.11.14
首页 上一页 10 11 12 13 14 15 16 17 18 19 20 下一页 末页