新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1656

 
MakarFX,试过了--没有变化,只在买入时打开,卖出时完全无视。
 
artem artem #:
MakarFX,试过了--没有变化,只在买入时打开,卖出时完全无视。
因此,结论是不存在切换布尔的条件
 
那么你需要添加什么来创造条件呢?
 
artem artem #:
我们应该在这些条件中加入什么?

解释一下这个逻辑...

第一个很清楚:有一个信号,没有订单开放...

...然后我不明白在什么条件下应该打开或关闭订单

 
artem artem #:
那么你需要添加什么来创造条件呢?

试试这个

//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   if(CheckForOpen()==0) // Если сигнал для покупок 
     {
      if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue))
         { Order=false; OrderBuy=true; OrderSell=false; Print("BUY OK"); } 
     } 
   if(CheckForOpen()==1) // Если сигнал для продаж 
     {
      if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red))
        { Order=false; OrderBuy=false; OrderSell=true; Print("SELL OK");} 
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res=-1, buy=0, sell=0;
   // Считывание параметров индикаторов 3 свечи (4ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 2 свечи (3ей)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 1 свечи (2ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 0 свечи (1ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   
   if(buy ==4 && OrderSell) res=0;
   if(sell==4 && OrderBuy)  res=1;
   return(res);
  }
//+------------------------------------------------------------------+
 

好吧,我按顺序解释一切,尽量具体,不要泛滥......

它是基于一种叫做 "普里亚法 "的趋势交易策略。它是基于跨越三条移动平均线和MACD柱状图的开口。两个缓慢的周期(75)和(85),线性加权法应用于Low。期限为5的快速平均,指数法,适用于关闭。MACD指标,参数为15/26/1。进场点是由两条慢速移动平均线交叉形成的,MACD条形图与快速条形图打开到相关区域(快速条形图和MACD条形图应在同一区域)。

  • 买入信号--MA(5)穿过并位于MA(75)和MA(85)之上,MACD柱在正区域打开。
  • 卖出信号--MA(5)交叉并低于MA(75)和MA(85),MACD在负值区域有一个开口条。

该EA放置一个固定的利润和止损。利润和止损的大小是在初始参数中设定的。订单只有在达到止盈或止损时才会关闭。

这就是最初的Puria Expert Advisors中的内容。此外,在最新的版本中,还有一个追踪止损和选择按特定时间交易。功能是有用的,但我现在对它们并不感兴趣。

现在,实际上,我已经做了/想要做什么补充。

1.为了进行交易 开盘 检查所有的指标条件(跨越两个慢速(75)(85)的快速(5)和MACD条在同一方向的快速(5)开盘),只在新蜡烛的开盘价 (每个30分钟蜡烛的第一个刻度) 进行。这一点已经得到了处理。
  1. 为指标的 "归零 "创造条件比如说 用于快速移动的 (5) 如果它高于慢速--那么它就是一个购买的信号。如果在这之后,它下降并触及其中之一,或处于慢速移动的(75)和(85 之间--那么来自快速移动指标的信号就像它一样"归零",并将保持在这个 "零 "的位置,只要它触及或保持在慢速1之间。如果在那之后 快速的一条越过两个慢速的一条到一边(包括如果它在触及慢速的一条之前回到它来的一边)--那么它将是这个指标的一个信号 使用MACD,情况类似- 只有 MACD=0才会被认为是 "归零"(例如,如果在第一根蜡烛上,MACD以0.0043开盘,而在第二根蜡烛上以-0.0010 开盘,这意味着第二根蜡烛上 MACD已经"归零" 并发出了新信号)。然而,有一段时间 快线(5)和MACD应该有点 "平起平坐" - 如果(5)没有改变它相对于慢线的位置,并且MACD在前一根蜡烛上开在错误的区域(没有进场),而在下一根蜡烛上 - 与快线在同一区域,那么所有的条件已经趋同,应该对订单进行进场。请注意,所有这些应该只在蜡烛的开盘价上进行--只在这一个刻度上进行
  1. 而最后,要让专家顾问等待4个连续的蜡烛开盘

    1. 第1个开盘价--(5)高于(75)和(85)+MACD柱子开在0以上--4个确认中的一个
    2.第2根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的2次是
    3.第3根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱子开在0以上-- 4次确认中的3次是
    4.第4根蜡烛的开盘价--(5)超过(75)和(85)+MACD柱在0以上开盘-- 4个确认 的4个-- 在同一根蜡烛(第4根)上开立买入交易
卖出 订单 情况也一样,只是在另一个方向的指标应该打开。有一点很重要--如果在第1根蜡烛到第4根蜡烛的任何阶段 指标改变了它们的位置(例如,在第3根开盘的蜡烛上,MACD柱打开时低于0,或者=0)--那么一切都被重置,因为信号没有通过连续第4根蜡烛开盘时的测试。


不知何故,如果有不清楚的地方,或有问题,请提出。

 
artem artem #:

好吧,我按顺序解释一切,尽量具体,不要泛滥......


  1. 为指标的 "归零 "创造条件

这就是归零。

   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}

也许我没有正确理解你...

试着做一个屏幕截图

 
我附上了一张截图,如果你有什么不明白的,就问吧
附加的文件:
 
artem artem #:
我附上了一张截图,如果你有不明白的地方,就问我。
我知道了,我会考虑的。
 
artem artem #:
附上一张截图,如果有什么不清楚的地方--尽管问。

试试这个--它能在这些地方打开吗?

//+------------------------------------------------------------------+
//|                                                  artem artem.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
#define  MagicNumber  122122
//---
#include <stdlib.mqh> // Стандартная библиотека
//---
input string s0 = "Баланс";            // 1
input string Template       = "ADX";   // Имя шаблона(without '.tpl')
input double TargetProfit   = 1000000; // Баланс + Прибыль(прибавить к балансу)
input double TargetLoss     = 0;       // Баланс - Убыток(отнять от баланса)
input string s1 = "Размер лота";       // 2
input double Lot            = 0.01;    // размер лота 0 - авт.расчет
input string s2 = "TP SL";             // 3
input double InpTProfit     = 1000;    // Exchange TP
input double InpStopLoss    = 1000000; // Exchange SL
input string s3 = "Индикатор";         // 4
input int    MovingPeriodLw = 13;      // MovingPeriodLw
input int    MovingPeriodS1 = 89;      // MovingPeriodS1
input int    MovingPeriodS2 = 144;     // MovingPeriodS2
input string s4 = "Day & Hour";        // 5
input int    HrStart        = 0;       // время начала торговли
input int    HrEnd          = 23;      // время окончания торговли
//+------------------------------------------------------------------+
int    Monday         = 1;      // Понедельник 1 вкд. 0 выкл.
int    Tuesday        = 1;      // Вторник
int    Wednesday      = 1;      // Среда
int    Thursday       = 1;      // Четверг
int    Friday         = 1;      // Пятница
//+------------------------------------------------------------------+
uint SLEEPTIME=1;
double Price[2];
datetime timeprev=0;
ENUM_TIMEFRAMES TimeFrame= PERIOD_CURRENT;
bool OrderBuy=false,OrderSell=false,Order=false,Init=true,ClOp=true;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Закрыть Общий профит или профит на паре
   if(ProfitTarget())
     {
      return;
     }
//--- Закрыть профит BUY или SELL на паре
   ProfitOnTick();
// Определение направления пересечения мувингов
   if(Init)
      InitMetod();
// Ожидание нового бара на графике
   if(timeprev == Time[0])
      return;
   timeprev = Time[0];
// Открытие ордера по методу Пуриа
   CheckForOpen();
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res;
// Считывание параметров индикаторов
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
// Проверяем положение мувмнгов
   if(malw>mas1 && malw>mas2  && OrderSell)
     {
      OrderBuy=true;
      OrderSell=false;
      Order=true;
     }
   if(malw<mas1 && malw<mas2  && OrderBuy)
     {
      OrderBuy=false;
      OrderSell=true;
      Order=true;
     }
// Открываем ордер Buy
   if(macd>0 && OrderBuy && Order)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,3,0,0,"",MagicNumber,0,Blue);
      Order=false;
      return;
     }
// Открываем ордер Sell
   if(macd<0 && OrderSell && Order)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,3,0,0,"",MagicNumber,0,Red);
      Order=false;
      return;
     }
  }
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
  {
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
      Init=false;
      OrderBuy=true;
      OrderSell=true;
     }
   return;
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
  {
   double Lots;
   if(Lot > 0)
      return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1)
      Lots=NormalizeDouble(Lots,2);
   else
     {
      if(Lots<1)
         Lots=NormalizeDouble(Lots,1);
      else
         Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
// Permission to trade in this day                                   |
//+------------------------------------------------------------------+
bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли
  {
   bool dtrade = false;
   switch(DayOfWeek())
     {
      case 1: // Monday
         if(Monday == 1)
            dtrade = true;
         break;
      case 2: // Tuesday
         if(Tuesday == 1)
            dtrade = true;
         break;
      case 3: // Wednesday
         if(Wednesday == 1)
            dtrade = true;
         break;
      case 4: // Thursday
         if(Thursday == 1)
            dtrade = true;
         break;
      case 5: // Friday
         if(Friday == 1)
            dtrade = true;
         break;
      default: //
         dtrade = false;
         break;
     }
   if(dtrade && !(Hour() >= hmin && Hour() <= hmax))
      dtrade = true;
   return dtrade;
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitTarget(void)
  {
   bool res=false;
   if(AccountInfoDouble(ACCOUNT_EQUITY)<=TargetLoss ||
      AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit)
     {
      CloseAllOrders();
      Sleep(SLEEPTIME*1000);
      CloseAllOrders();
      ExpertRemove();
      DeleteChart();
      PlaySound("expert.wav");
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitOnTick(void)
  {
   bool res=false;
   double PROFIT_BUY=0.00;
   double PROFIT_SELL=0.00;
   for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of open positions
     {
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+NormalizeDouble(OrderProfit(),2);
           }
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+NormalizeDouble(OrderProfit(),2);
           }
        }
     }
   int Close_ticketb=0;
   int totalb=OrdersTotal();
   int b = 0;
   for(b = totalb; b >=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         //OrderSelect(i,SELECT_BY_POS);
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            if(PROFIT_BUY<-InpStopLoss || PROFIT_BUY>=InpTProfit)
              {
               Close_ticketb = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),5);
               PlaySound("ok.wav");
              }
           }
        }
      res=true;
     }
   int Close_tickets=0;
   int totals=OrdersTotal();
   int s = 0;
   for(s = totals; s >=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            if(PROFIT_SELL<-InpStopLoss || PROFIT_SELL>=InpTProfit)
              {
               Close_tickets = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),5);
               PlaySound("ok.wav");
              }
           }
        }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void CloseAllOrders(void)
  {
   int iOrders=OrdersTotal()-1, i;
   if(ClOp)
     {
      for(i=iOrders; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() &&
            !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],0))
            Print(OrderError());
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderDelete(OrderTicket()))
               Print(OrderError());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError(void)
  {
   int iError=GetLastError();
   return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
  }
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo(void)
  {
   RefreshRates();
   Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
   Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
   double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
   if(dPoint==0)
      return(false);
   return(Price[0]>0.0 && Price[1]>0.0);
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void DeleteChart(void)
  {
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   bool errTemplate;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(TimeFrame!=PERIOD_CURRENT)
        {
         ChartSetSymbolPeriod(prevChart,ChartSymbol(prevChart),TimeFrame);
        }
      errTemplate=ChartApplyTemplate(prevChart,Template+".tpl");
      if(!errTemplate)
        {
         Print("Error ",ChartSymbol(prevChart),"-> ",GetLastError());
        }
      if(currChart<0)
         break;
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;
      i++;
     }
  }
//+------------------------------------------------------------------+