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

 
还有谁可以帮忙?)
 
Rustam Bikbulatov:
还有谁可以帮忙?)

你似乎已经得到了全面的答案和例子,但你仍然需要阅读帮助以了解函数是如何被调用的,以及为什么使用静态修饰符

这里有另一种方法,也许对你来说会更容易理解。

int N(bool reset=false) // если вызываем N() то возвращает следующее значение n++, при первом вызове n=0, но вернет 1, т.к. n=0, а затем n++, если нужно 0 то 
			// или  static int n=-1; или вызывайте сначала N(true)
  {                     // если вызываем N(true), то сбрасываем n=0 и возвращзаем 0
   static int n=0;
   if(reset) n=0; else n++;
   return n;
  }
 
Igor Makanu:

你似乎已经得到了全面的答案和例子,但你仍然需要阅读帮助以了解函数是如何被调用的,以及为什么使用静态修饰符

这里有另一种变体,也许这将使你更容易理解。

第一个例子显示了一个函数调用,当没有位置时,返回的结果被比较。

if( ((OpenB-Ask)/ma+TimeB/60) > N() )

这就是为什么可能值得只做返回而不做归零和添加。我已经实现了2种变体

 
//+------------------------------------------------------------------+
//|                                                 elliotbutton.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  ButtonCreate();
  ButtonCreate(0,"ButtonMinor",0,10,60,50,50,CORNER_LEFT_UPPER,"(i)","Arial",12,clrBlack, C'236,233,216',clrNONE,false,false,false,false,0);
  
  
     return(INIT_SUCCEEDED);
  }

void OnTick()
  {
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
         if (ObjectGetInteger(0,"Button",OBJPROP_STATE,0)==true) 
          {
               int      x     =(int)lparam;
               int      y     =(int)dparam;
               datetime dt    =0;
               double   price =0;
               int      window=0;
                        if(ChartXYToTimePrice(0,x,y,window,dt,price))  
                         {
                         PrintFormat("Window=%d X=%d  Y=%d  =>  Time=%s  Price=%G",window,x,y,TimeToString(dt),price);
                                 if(ChartTimePriceToXY(0,window,dt,price,x,y))
                                     PrintFormat("Time=%s  Price=%G  =>  X=%d  Y=%d",TimeToString(dt),price,x,y);
                                 ChartRedraw(0);
                         }
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"i","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
            
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"ii","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
          
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"iii","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0);
           
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"iv","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
             
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"v","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
               
               ObjectSetInteger(0,"Button",OBJPROP_STATE,False);
             }
                        
               
          if (ObjectGetInteger(0,"ButtonMinor",OBJPROP_STATE,0)==true) 
          {
               int      x     =(int)lparam;
               int      y     =(int)dparam;
               datetime dt    =0;
               double   price =0;
               int      window=0;
                        if(ChartXYToTimePrice(0,x,y,window,dt,price))  
                         {
                         PrintFormat("Window=%d X=%d  Y=%d  =>  Time=%s  Price=%G",window,x,y,TimeToString(dt),price);
                                 if(ChartTimePriceToXY(0,window,dt,price,x,y))
                                     PrintFormat("Time=%s  Price=%G  =>  X=%d  Y=%d",TimeToString(dt),price,x,y);
                                 ChartRedraw(0);
                         }
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"(i)","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
            
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"(ii)","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
          
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"(iii)","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0);
           
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"(iv)","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
             
               TextCreate(0,"Text "+string(MathRand()),0,dt,price,"(v)","Arial",10,clrBlack,0.0,ANCHOR_LEFT_UPPER,false,true,false,0); 
               
               ObjectSetInteger(0,"ButtonMinor",OBJPROP_STATE,False);
               
            
           }
 }
            
  
  

void OnDeinit(const int reason)
  {
   ObjectDelete(0,"Button");
   ObjectDelete(0,"ButtonMinor");
  }
  
bool ButtonCreate(const long              chart_ID=0,               // ID графика 
                  const string            name="Button",            // имя кнопки 
                  const int               sub_window=0,             // номер подокна 
                  const int               x=10,                      // координата по оси X 
                  const int               y=10,                      // координата по оси Y 
                  const int               width=50,                 // ширина кнопки 
                  const int               height=50,                // высота кнопки 
                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // угол графика для привязки 
                  const string            text="i",                 // текст 
                  const string            font="Arial",             // шрифт 
                  const int               font_size=10,             // размер шрифта 
                  const color             clr=clrBlack,             // цвет текста 
                  const color             back_clr=C'236,233,216',  // цвет фона 
                  const color             border_clr=clrNONE,       // цвет границы 
                  const bool              state=false,              // нажата/отжата 
                  const bool              back=false,               // на заднем плане 
                  const bool              selection=false,          // выделить для перемещений 
                  const bool              hidden=false,              // скрыт в списке объектов 
                  const long              z_order=0)                // приоритет на нажатие мышью 
  { 

   ResetLastError(); 

   if(ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) 
     { 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 
   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
      }
  return(true); 
 }
 
 bool TextCreate(const long              chart_ID=0,              // ID графика 
                const string            name="Text",              // имя объекта 
                const int               sub_window=0,             // номер подокна 
                datetime                time=0,                   // время точки привязки 
                double                  price=0,                  // цена точки привязки 
                const string            text="Text",              // сам текст 
                const string            font="Arial",             // шрифт 
                const int               font_size=10,             // размер шрифта 
                const color             clr=clrBlack,             // цвет 
                const double            angle=0.0,                // наклон текста 
                const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки 
                const bool              back=false,               // на заднем плане 
                const bool              selection=true,           // выделить для перемещений 
                const bool              hidden=true,              // скрыт в списке объектов 
                const long              z_order=0)                // приоритет на нажатие мышью 
  { 

   ResetLastError(); 

   if(ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price)) 
     { 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle); 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
     }
   return(true); 
 } 



  
  

写一个EA,当我点击按钮时,它会在图表上的位置创建一个文本,如鼠标所示。现在我的专家顾问只创建文本来代替按钮。

 

你好,如何使我手动拖放买入止损挂单 时,其他卖出止损挂单也会随之移动?

我怎样才能将一个绑定到另一个上,这样当我移动一个时,它就会同时移动两个?

 


Здравствуйте. У меня алгоритм такой 
//----------------------------------------------------------------------------
if (CountBuy() == 0)
{

BuySignal = h1; tttp=1; 
if (BuySignal > 0 && tttp==1 && h2>0)
{
CloseSell();
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);

if (ticket > 0)
{

if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{

SL = NormalizeDouble(Ask-StopLoss*Point, Digits);

TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);

res = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
if (!res)

Print("Ошибка модификации ордера на покупку, ASK=" + DoubleToStr(Ask) + ", SL=" + DoubleToStr(SL) + ", TP=" + DoubleToStr(TP)); 
}
}
}
}
if (CountSell() == 0)
{
SellSignal= l1; tttp=-1;
if (SellSignal > 0 && tttp==-1 && l2>0)
{
CloseBuy();
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
{
SL = NormalizeDouble(Bid+StopLoss*Point, Digits);
TP = NormalizeDouble(Bid-TakeProfit*Point, Digits);
res = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
if (!res)
Print("Ошибка модификации ордера на продажу, BID=" + DoubleToStr(Bid) + ", SL=" + DoubleToStr(SL) + ", TP=" + DoubleToStr(TP)); 
}
}
}
}
} 
//------------------------------------------------------------------------------------------
Пытаюсь сделать, чтоб условия на открытие ордера проверялось бы через какое-то кол-во баров, а так сразу открывается другой ордер
 
Carcass77:

为什么是垃圾邮件?

 
Konstantin Nikitin:

为什么是垃圾邮件?

你在几个主题中写的东西?我可以把它拿下来。
 
Ihor Herasko:

编写你自己的蜱虫,并把它们放在策略测试器中

问候。你能告诉我问题是什么以及如何解决吗?

我改变了历史上的一些蜡烛图进行测试,为第1、2、3和6号。

当测试时,第二个被处理,第三个被绘制(没有处理),停止时给出一个错误,因为Stop Out而停止。



 

下午好

我有一个非常简单的情况,但我在解决这个问题时遇到了困难。

请告诉我我做错了什么。

问题:我不能通过iCustom将自定义指标(i-DRP...)与专家顾问(DR Test)绑定。

预先感谢

附加的文件:
原因: