когда открыл ордер запоминай время открытия, чтобы на баре два раза не открыться. Синал открытия запоминай в переменную типа статик. Когда будет сигнал на закрытие или противоположное открытие - обнуляй ее. Если сигнал открытия не равен нулю, то перед открытие проверяй время последнего открытия.
На одном тике много позиций не получится закрыть, поэтому сигнал закрытия тоже надо в переменной типа статик запоминать, после блока закрытия делать проверку на закрытость, если все закрыты, то обнулять ее. И еще немного логики...
Не могу сделать, вот код:
//+------------------------------------------------------------------+ //| MoneyPlus.mq4 | //| Copyright © 2006, Victor Chebotariov | //| http://www.chebotariov.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Victor Chebotariov" #property link "http://www.chebotariov.com/" #define MAGICMA 21072006 extern int PERIOD = 30; extern int SHIFT = 0; extern double LOTS = 0.1; //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int cnt, ticket; int total=OrdersTotal(); if(!GlobalVariableCheck("Symbol()"+"MAGICMA"+"TimeBuySell") || GlobalVariableGet("Symbol()"+"MAGICMA"+"TimeBuySell")!=Time[0]) { if(условие для покупки) { ticket=OrderSend(Symbol(),OP_BUY,LOTS,Ask,3,0,0,"MoneyPlus",MAGICMA,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); GlobalVariableSet("Symbol()"+"MAGICMA"+"TimeBuySell",Time[0]); } else Print("Error opening BUY order : ",GetLastError()); return(0); } if(условие для продажи) { ticket=OrderSend(Symbol(),OP_SELL,LOTS,Bid,3,0,0,"MoneyPlus",MAGICMA,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); GlobalVariableSet("Symbol()"+"MAGICMA"+"TimeBuySell",Time[0]); } else Print("Error opening SELL order : ",GetLastError()); return(0); } } if(усломвие для закрытия всех позиций на покупку) { for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); return(0); } } } if(усломвие для закрытия всех позиций на продажу) { for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()==OP_SELL && OrderSymbol()==Symbol()) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); return(0); } } } //---- return(0); } //+------------------------------------------------------------------+
В общем-то первая чать работает, позиции открываються один раз
при новом баре, а вот закрываться при сигнале к закрытию никак
не хотят.
Об этом уже говорили - вместо:
for(cnt=0;cnt<total;cnt++)
нужно:
for(cnt=total-1;cnt>=0;cnt--)
Ты закрыл элемент 0 и тогда тот, который был 1, стал 0. И т.д.
Спасибо. Все отлично работает.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здрасте всем. Помогите кто может.
У меня при написании эксперта возникли некоторые сложности.
Для начала опишу немного что долен делать эксперт.
1. Я определил сигнал на покупку или продажу, купил или продал соответственно.
2. На следующем баре опять проверил, если нет противоположного сигнала или сигнала для закрытия, опять открыл токую же позицию. И так на каждом новом бере.
3. При появлении сигнала для закрытия, мне нужно чтобы сразу закрылись все открытые позиции по предыдущему сигналу.
Вроде просто, а не получаеться.