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

趋势123

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-26 01:51:00 | 显示全部楼层 |阅读模式
//+------------------------------------------------------------------+

//|                                               Moving Average.mq4 |

//|                             Copyright 2000-2025, MetaQuotes Ltd. |

//|                                              http://www.mql5.com |

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

#property copyright   "2000-2025, MetaQuotes Ltd."

#property link        "https://www.mql5.com"

#property description "Moving Average sample expert advisor"


#define MAGICMA  20131111

//--- Inputs

input double Lots          =0.1;

input double MaximumRisk   =0.02;

input double DecreaseFactor=3;

input int    MovingPeriod  =12;

input int    MovingShift   =6;

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

//| Calculate open positions                                         |

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

int CalculateCurrentOrders(string symbol)

  {

   int buys=0,sells=0;

//---

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)

        {

         if(OrderType()==OP_BUY)  buys++;

         if(OrderType()==OP_SELL) sells++;

        }

     }

//--- return orders volume

   if(buys>0) return(buys);

   else       return(-sells);

  }

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

//| Calculate optimal lot size                                       |

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

double LotsOptimized()

  {

   double lot=Lots;

   int    orders=HistoryTotal();     // history orders total

   int    losses=0;                  // number of losses orders without a break

//--- select lot size

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//--- calcuulate number of losses orders without a break

   if(DecreaseFactor>0)

     {

      for(int i=orders-1;i>=0;i--)

        {

         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)

           {

            Print("Error in history!");

            break;

           }

         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)

            continue;

         //---

         if(OrderProfit()>0) break;

         if(OrderProfit()<0) losses++;

        }

      if(losses>1)

         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

     }

//--- return lot size

   if(lot<0.1) lot=0.1;

   return(lot);

  }

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

//| Check for open order conditions                                  |

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

void CheckForOpen()

  {

   double ma;

   int    res;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//--- sell conditions

   if(Open[1]>ma && Close[1]<ma)

     {

      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

      return;

     }

//--- buy conditions

   if(Open[1]<ma && Close[1]>ma)

     {

      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

      return;

     }

//---

  }

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

//| Check for close order conditions                                 |

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

void CheckForClose()

  {

   double ma;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//---

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

      //--- check order type

      if(OrderType()==OP_BUY)

        {

         if(Open[1]>ma && Close[1]<ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

      if(OrderType()==OP_SELL)

        {

         if(Open[1]<ma && Close[1]>ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

     }

//---

  }

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

//| OnTick function                                                  |

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

void OnTick()

  {

//--- check for history and trading

   if(Bars<100 || IsTradeAllowed()==false)

      return;

//--- calculate open orders by current symbol

   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

   else                                    CheckForClose();

//---

  }

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

本版积分规则

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

GMT+8, 2026-10-11 13:53 , Processed in 0.097497 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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