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

 
Vitalie Postolache:

你去那里,这是不一样的,现在很清楚这1%与什么有关了;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
你无法理解这种语言。 对于两个词你需要10行,然后对于10个词只需要2行就够了......你会认为编程会有一个顺序,然后最后会出现混乱)
 
spoiltboy:
专家顾问考虑最后X条的最小和最大值,并根据它们下订单。然后,当最大或最小值减少时,你应该删除相应的订单并通过新的数据打开。


不明白到底什么时候修改停顿,但做到了如果最低价格 高于现有的BuyLimit设置价格,那么就需要修改为新的Min价格。

对于SellLimit - 镜像。

我只写了代码,但根本没有检查它--我把它留给你来修改和检查算法和代码的正确性。

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataPendingOrder
  {
   int      number;     // Количество
   double   price_set;  // Цена установки
  };

struct DataPending
  {
   DataPendingOrder  buy_limit;  // BuyLimit
   DataPendingOrder  buy_stop;   // BuyStop
   DataPendingOrder  sell_limit; // SellLimit
   DataPendingOrder  sell_stop;  // SellStop
  };

struct DataOrders
  {
   int         buy;     // Количество позиций Buy
   int         sell;    // Количество позиций Sell
   DataPending order;   // Данные отложенного ордера
  };
DataOrders getData;   // Данные ордеров и позиций
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,getData);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0, minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- если нету рыночных Buy
   if(getData.buy==0) {
      //--- если нет отложенного BuyLimit
      if(getData.order.buy_limit.number==0) {
         double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
         double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
         ResetLastError();
         int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
         if(ticketUP==-1) Print("ERROR SETTING OP_BUYLIMIT :",GetLastError());
         else Print("OP_BUYLIMIT OK");
         }
      //--- если есть BuyLimit
      else {
         //--- если цена Min больше цены установки BuyLimit
         if(minPrice>getData.order.buy_limit.price_set) {
            // модифицировать BuyLimit - поставить его на цену minPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }
  
   //--- если нету рыночных Sell
   if(getData.sell==0) {
      //--- если нет отложенного SellLimit
      if(getData.order.sell_limit.number==0) {
         double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
         double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
         ResetLastError();
         int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
         if(ticketD==-1) Print("ERROR SETTING OP_SELLLIMIT :",GetLastError());
         else Print("OP_SELLLIMIT OK");
         }
      //--- если есть SellLimit
      else {
         //--- если цена Max меньше цены установки SellLimit
         if(maxPrice<getData.order.sell_limit.price_set) {
            // модифицировать SellLimit - поставить его на цену maxPrice ...
            //--- ... и сместить его стоп-уровни относительно новой цены установки
            }
         }
      }

   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataOrders &data_of) {
   ZeroMemory(data_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         //--- рыночные позиции
         if(OrderType()==OP_BUY)    data_of.buy++;
         if(OrderType()==OP_SELL)   data_of.sell++;
         //--- отложенные ордера
         if(OrderType()==OP_BUYLIMIT)  {  data_of.order.buy_limit.number++;   data_of.order.buy_limit.price_set=OrderOpenPrice();   }
         if(OrderType()==OP_BUYSTOP)   {  data_of.order.buy_stop.number++;    data_of.order.buy_stop.price_set=OrderOpenPrice();    }
         if(OrderType()==OP_SELLLIMIT) {  data_of.order.sell_limit.number++;  data_of.order.sell_limit.price_set=OrderOpenPrice();  }
         if(OrderType()==OP_SELLSTOP)  {  data_of.order.sell_stop.number++;   data_of.order.sell_stop.price_set=OrderOpenPrice();   }
         }
      }
}
//+------------------------------------------------------------------+

我希望你能想出办法

 
Artyom Trishkin:

当你可以修改设定的价格和相对于新水平的止损和退出时,为什么要删除?

我刚刚开始学习,删除选项是为了研究函数的应用,我想知道为什么没有用。

谢谢大家的反馈。

 

有谁想知道外部重置命令应该是什么样子的?

它应该是什么样子的

1) 从列表中选择一组所需的条件来触发命令,例如,打开一个订单

2)订单被打开,在任何其他条件下,命令都不起作用。按票据和订单数量 过滤不是一个选项,因为原则本身应该遍布整个列表。

 
如果(MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point()如果GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] 使用移动 交叉点+移动交叉点后的距离过滤,这里的错误是什么?这个条件有多准确?
 
Movlat Baghiyev:
如果(MA1>GrossMA1 && MA2<GrossMA2 && Bid>MA1+Distanse*Point()如果GrossMA1[0], MA1[0] GrossMA2[1] MA2[1] 使用移动交叉点+移动交叉点后的距离过滤,这里的错误是什么?这个条件有多准确?

GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的

MA1= 1.0050

if (MA1 > 0.0052) // 这不是价格本身,而是它的差异,所以它不是一个错误的比较。

 
Vitaly Muzichenko:

GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的

MA1= 1.0050

if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。

你能告诉我如何正确地做到这一点吗?
 
Vitaly Muzichenko:

GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的

MA1= 1.0050

if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。

FRMA1=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 0);
    FRMA2=iMA(Symbol(), 0, Faster_MA_Period, Faster_MA_Shift, Faster_MA_method, Faster_MA_Apply_to, 1);

    FMA1=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 0);
    FMA2=iMA(Symbol(), 0, Fast_MA_Period, Fast_MA_Shift, Fast_MA_method, Fast_MA_Apply_to, 1);

    GrossMA1=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 0);
    GrossMA2=iMA(Symbol(), 0, Gross_MA_Period, Gross_MA_Shift, Gross_MA_method, Gross_MA_Apply_to, 1);
 
Vitaly Muzichenko:

GrossMA1和GrossMA2 返回给你的东西,那里很可能有区别,你最后得到的东西 是这样的

MA1= 1.0050

if (MA1 > 0.0052) // 即不是价格本身,而是它的差异,所以是一个不正确的比较。

交叉点是真实的。问题是与这个条件更相关的是Bid>MA1+Distanse*Point()。
 

很好。你能告诉我错误在哪里吗?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

一切顺利,以maxpr1的价格下了一个订单。

然后我想做同样的事,但以minpr1的价格。

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

错误130(错误停止)。我做错了什么?