Скачать MetaTrader 5

Помогите исправить ошибку

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114267
Forex Trader 2007.07.17 10:41 
Скижите пожалуйста, какая ошибка при написании этого кода. Суть в том, если StB растет, то последнее значении изменяется, если нет, то остается предыдущим. То же самое и с StL, но для понижения. Два последних значения StB[0] и StL[0] хочу использовать для стоп-лосов, но эксперт их не видит и выставляет значение стоп-лосс 0.0
double StB[];
{
 StB[0]=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
    if(StB[1]> StB[0])
  
     {        
        StB[0]=StB[1];
     }
}
double StS[];
{
StS[0]=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
  if(  StS[1]<StS[0])             
     {
        StS[0]=StS[1];
     }
}
    
Forex Trader
114267
Forex Trader 2007.07.17 12:53  
попробуй выделить память под массивы
double StB[2];
double StB[2];
Forex Trader
114267
Forex Trader 2007.07.17 12:53  
StB[] и StS[] нужно отвести память (см. ArrayResize ) Если предполагалось, что они будут работать как таймсерии то по моим представлениям в эксперте этого сделать нельзя, нужно запихнуть их в индикатор и читать значения через iCustom.

P.S. Мда, фотофиниш оставил меня вторым :)
Forex Trader
114267
Forex Trader 2007.07.17 13:21  
StB[] и StS[] нужно отвести память (см. ArrayResize ) Если предполагалось, что они будут работать как таймсерии то по моим представлениям в эксперте этого сделать нельзя, нужно запихнуть их в индикатор и читать значения через iCustom.


Чесно говоря, я пока что только начал изучать MQL и не знаю будет ли он работать как таймсерия или нет, вот код, который я написал, и постарался исправить как вы сказали. Как бы стоп он выставляет теперь, но он почему то прыгает вверх и низ, хотя по идее и не должен.
//+------------------------------------------------------------------+
//|                                                          Мой.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double lot=0.1;
extern double kATR=1.5;
extern int pATR=20;
extern int pPos=20;
extern int TP=50;
extern int SL=50;
extern int MagNum=1000;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int total;
   int pos;
   int ticketbuy;
   int ticketsell;

 
{
double StB[];
ArrayResize(StB,10);
{
 StB[0]=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
    if(StB[1]> StB[0])
  
     {        
        StB[0]=StB[1];
     }
}
double StS[];
ArrayResize(StS,10);
{
StS[0]=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
  if(  StS[1]<StS[0])             
     {
        StS[0]=StS[1];
     }
}    
}
    total=OrdersTotal();
      if (total<1)
   { 
     {  
      {
        ticketbuy=OrderSend(Symbol(),OP_BUYSTOP, lot,High[iHighest(NULL,0,MODE_HIGH,pPos,1)]+MarketInfo(Symbol(),MODE_SPREAD)*0.0001,
        3, 0,0,NULL, MagNum, 0, CLR_NONE);
       if(ticketbuy>0)
           {
            if(OrderSelect(ticketbuy,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSELL order  : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
          
      }
      {
        ticketsell=OrderSend(Symbol(),OP_SELLSTOP, lot,Low[iLowest(NULL,0,MODE_LOW,pPos,1)],
        3, 0 ,0,NULL, MagNum, 0, CLR_NONE);
       if(ticketsell>0)
           {
            if(OrderSelect(ticketsell,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSELL order  : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
      }
     } 
       return(0);
    }
            
for (pos=0; pos<=total;pos++)
 {
     if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
          {
           if (OrderType()==OP_BUYSTOP)
              if (OrderSymbol()==Symbol())
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),High[iHighest(NULL,0,MODE_HIGH,pPos,1)]+MarketInfo(Symbol(),MODE_SPREAD)*0.0001,
                StB[0],0,0,CLR_NONE);    
          }
          {
            if (OrderType()==OP_BUY)
              if (OrderSymbol()==Symbol())
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),OrderOpenPrice(),
                StB[0],0,0,CLR_NONE);    
          }
        if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
          {
           if (OrderType()==OP_SELLSTOP)
              if (OrderSymbol()==Symbol())
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),Low[iLowest(NULL,0,MODE_LOW,pPos,1)],
                StS[0],0,0,CLR_NONE);    
          }
          {
            if (OrderType()==OP_SELL)
              if (OrderSymbol()==Symbol())
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),OrderOpenPrice(),
                StS[0],0,0,CLR_NONE);    
          }    
 }         

  
//----
   return(0);
  }
//+------------------------------------------------------------------+
Forex Trader
114267
Forex Trader 2007.07.18 09:02  
Пользовательскими таймсериями могут быть только индикаторные буферы. StB[1] и StS[1] в этом коде ничего не присваивается и поэтому их значения никогда не меняются (можно проверить с помощью Print). Имитировать таймсерию (точнее скользящее окно фиксированного размера) легко, нужно на каждом новом баре производить операцию типа StS[i+1]=StS[i]; Хотя на самом деле для больших окон дешевле просто двигать закольцованный указатель текущего значения.
В данном коде (если я ничего не пропустил) можно вообще без массивов, переменными double StB,preStB,StS,preStS;
Кстати, объявление double StS[10]; эквивалентно строкам
double StS[];
ArrayResize(StS,10);


но в ArrayResize размер может быть переменной, то есть ArrayResize предназначен для перераспределения памяти во время выполнения программы.

Forex Trader
114267
Forex Trader 2007.07.18 12:19  
В данном коде (если я ничего не пропустил) можно вообще без массивов, переменными double StB,preStB,StS,preStS;

Вроде бы все понял, получилоси вот что:
//+------------------------------------------------------------------+
//|                                                          Мой.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern double lot=0.1;
extern double kATR=1.5;
extern int pATR=20;
extern int pPos=20;
extern int MagNum=1000;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int total;
   int pos;
   int ticketbuy;
   int ticketsell;

 

double StB;
double preStB;
double StS;
double preStS;

    total=OrdersTotal();
      if (total<1)
   { 
     {  
      {
        ticketbuy=OrderSend(Symbol(),OP_BUYSTOP, lot,High[iHighest(NULL,0,MODE_HIGH,pPos,1)]+MarketInfo(Symbol(),MODE_SPREAD)*0.0001,
        3, 0,0,NULL, MagNum, 0, CLR_NONE);
       if(ticketbuy>0)
           {
            if(OrderSelect(ticketbuy,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSELL order  : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
          
      }
      {
        ticketsell=OrderSend(Symbol(),OP_SELLSTOP, lot,Low[iLowest(NULL,0,MODE_LOW,pPos,1)],
        3, 0 ,0,NULL, MagNum, 0, CLR_NONE);
       if(ticketsell>0)
           {
            if(OrderSelect(ticketsell,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSELL order  : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
      }
     } 
       return(0);
    }
            
for (pos=0; pos<=total;pos++)
 {
     if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
          {
           if (OrderType()==OP_BUYSTOP)
              if (OrderSymbol()==Symbol())
                StS=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
                preStB=StB;
                StB=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
                if(  preStB>StB)             
                  {
                   StB=preStB;
                  } 
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),High[iHighest(NULL,0,MODE_HIGH,pPos,1)]+MarketInfo(Symbol(),MODE_SPREAD)*0.0001,
                StB,0,0,CLR_NONE);    
          }
          {
            if (OrderType()==OP_BUY)
              if (OrderSymbol()==Symbol())
                StS=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
                preStB=StB;
                StB=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
                if(  preStB>StB)             
                  {
                   StB=preStB;
                  } 
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),OrderOpenPrice(),
                StB,0,0,CLR_NONE);    
          }
        if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
          {
           if (OrderType()==OP_SELLSTOP)
              if (OrderSymbol()==Symbol())
                StB=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
                preStS=StS;
                StS=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
                if(  preStS<StS)             
                  {
                   StS=preStS;
                  } 
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),Low[iLowest(NULL,0,MODE_LOW,pPos,1)],
                StS,0,0,CLR_NONE);    
          }
          {
            if (OrderType()==OP_SELL)
              if (OrderSymbol()==Symbol())
                StB=NormalizeDouble((iLow(Symbol(),0,1)-kATR*iATR(Symbol(),0,pATR,1)),4);
                preStS=StS;
                StS=NormalizeDouble((iHigh(Symbol(),0,1)+kATR*iATR(Symbol(),0,pATR,1)),4);
                if(  preStS<StS)             
                  {
                   StS=preStS;
                  }
                if (IsTradeAllowed()==true)
                 OrderModify(OrderTicket(),OrderOpenPrice(),
                StS,0,0,CLR_NONE);    
          }    
 }         

  
//----
   return(0);
  }
//+------------------------------------------------------------------+


но стоп все равно прыгает. А идея такова что он должен либо только расти, либо только падать, вот например StB:
знач. граф..... StB......preStB........Stb с учетом preStB
1.....................1
2.....................2..........1.................2
4.....................4..........2.................4
3.....................3..........4.................4
2.....................2..........4.................4
5.....................5..........4.................5
7.....................7..........5.................7
4.....................4..........7.................7
6.....................6..........7.................7
8.....................8..........7.................8

Forex Trader
114267
Forex Trader 2007.07.18 14:31  
StB и StS нужно объявлять или глобально, или static, иначе при каждом вызове start они обнуляются.
Кстати, а при открытии ордера не нужно давать начальные значения StB и StS?
Похоже здесь имитировать таймсерию не нужно, нужен просто скользящий минимум и максимум, тогда логика может быть проще.
Forex Trader
114267
Forex Trader 2007.07.18 14:35  
Здесь был дубликат предыдущего поста
Forex Trader
114267
Forex Trader 2007.07.19 11:11  
StB и StS нужно объявлять или глобально, или static, иначе при каждом вызове start они обнуляются.
Кстати, а при открытии ордера не нужно давать начальные значения StB и StS?
Похоже здесь имитировать таймсерию не нужно, нужен просто скользящий минимум и максимум, тогда логика может быть проще.

Да спасибо большое за подсказки, помогло и всё работает
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий