- Типы ордеров - Принципы трейдинга - Торговля - MetaTrader 5 для Android
- Типы ордеров - Принципы трейдинга - Торговля - MetaTrader 5 для iPhone
- On Balance Volume - Индикаторы объемов - Индикаторы - Чарты - MetaTrader 5 для Android
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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования