//+------------------------------------------------------------------+ //| MACDSimpleReshetov.mq4 | //| Copyright © 2006, Yury V. Reshetov | //| http://reshetov.xnet.uz/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Yury V. Reshetov ICQ: 282715499" #property link "http://reshetov.xnet.uz/" //---- Входные и пр. параметры //Lots - объем открытых позиций extern double Lots = 2; // Смещение (приращение) периода быстрой скользящей средней // к периоду сигнальной линии extern int DF = 1; // Смещение (приращение) периода медленной скользящей средней // к периоду быстрой скользящей средней extern int DS = 2; // Период сигнальной линии extern int SignalPeriod = 10; // prevtime - предыдущее время (предыдущего бара) static int prevtime = 0; //+------------------------------------------------------------------+ //| Функция инициализации | //+------------------------------------------------------------------+ int init() { return(0); } //+------------------------------------------------------------------+ //| Деинициализирующая функция | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Функция start | //+------------------------------------------------------------------+ int start() { // Тикет позиции int ticket = 0; // Проверим, сформировался ли новый бар? // Если не сформировался, то выходим. // Это позволит избежать ложных срабатываний во флэте и рендже if(Time[0] == prevtime) return(0); // Запомним текущее время prevtime = Time[0]; // Значение основной линии MACD double main = iMACD(Symbol(), 0, SignalPeriod + DF, SignalPeriod + DS + DF, SignalPeriod, PRICE_CLOSE, MODE_MAIN, 0); // Значение сигнальной линии MACD double signal = iMACD(Symbol(), 0, SignalPeriod + DF, SignalPeriod + DS + DF, SignalPeriod, PRICE_CLOSE, MODE_SIGNAL, 0); // открытые позиции int total = OrdersTotal(); for(int cnt = 0; cnt < total; cnt++) { // Ну-ка глянем OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); int tick = OrderTicket(); double openprice = OrderOpenPrice(); double closeprice = Bid; double comission = OrderCommission(); double swap = OrderSwap(); double profit = OrderProfit(); // Случайно, это не наш инструмент? if(OrderSymbol() == Symbol()) { // Ага! Он самый // Здесь мы покупали, а сигнал на продажу if(OrderType() == OP_BUY && main < 0) { // Так дело не пойдет, выходим из рынка if(OrderClose(OrderTicket(), OrderLots(), closeprice, 3, Blue)) { // Отправим весточку инвестору SendMail("Close buy position " + Symbol(), "Order #" + tick + ", close at price " + closeprice + " with profit $" + profit + ".\nOpen price " + openprice + "\nComission " + comission + "\nSwap " + swap + ".\n___\nBalance $" + AccountBalance() + "\nEquity $" + AccountEquity() + "\nTotalProfit $" + AccountProfit() + "\nFreeMargin $" + AccountFreeMargin()); } return(0); } // Здесь мы продавали, а сигнал на покупку if(OrderType() == OP_SELL && main > 0) { closeprice = Ask; // Верните наши денежки или то, что от них осталось if(OrderClose(OrderTicket(), OrderLots(), closeprice, 3, Red)) { // Отправим весточку инвестору SendMail("Close Sell position " + Symbol(), "Order #" + tick + ", close at price " + closeprice + " with profit $" + profit + ".\nOpen price " + openprice + "\nComission " + comission + "\nSwap " + swap + ".\n___\nBalance $" + AccountBalance() + "\nEquity $" + AccountEquity() + "\nTotalProfit $" + AccountProfit() + "\nFreeMargin $" + AccountFreeMargin()); } return(0); } // Открытая позиция на этом инструменте уже есть, вторую открывать не будем, // а лучше завершим работу эксперта return(0); } } // Если обе линии по одну сторону фронта, то входим в рынок if((main * signal) > 0) { // Если сигнал на покупку if(main > 0) { // Значит купим if(main > signal) ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, 0, 0, "MACDSimple", 888, 0, Blue); return(0); } else { // Здесь мы продаем if (main < signal) ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, 0, 0, "MACDSimple", 888, 0, Red); return(0); } } return(0); } //+------------------------------------------------------------------+