double StB[2];
double StB[2];
P.S. Мда, фотофиниш оставил меня вторым :)
Чесно говоря, я пока что только начал изучать 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);
}
//+------------------------------------------------------------------+
В данном коде (если я ничего не пропустил) можно вообще без массивов, переменными double StB,preStB,StS,preStS;
Кстати, объявление double StS[10]; эквивалентно строкам
double StS[]; ArrayResize(StS,10);
но в ArrayResize размер может быть переменной, то есть ArrayResize предназначен для перераспределения памяти во время выполнения программы.
Вроде бы все понял, получилоси вот что:
//+------------------------------------------------------------------+
//| Мой.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
Кстати, а при открытии ордера не нужно давать начальные значения StB и StS?
Похоже здесь имитировать таймсерию не нужно, нужен просто скользящий минимум и максимум, тогда логика может быть проще.
Кстати, а при открытии ордера не нужно давать начальные значения StB и StS?
Похоже здесь имитировать таймсерию не нужно, нужен просто скользящий минимум и максимум, тогда логика может быть проще.
Да спасибо большое за подсказки, помогло и всё работает
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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]; } }