Добрый день. Нужен простой советник который бы открывал позицию при пересечении 2 МА и закрывал позицию при при обратном пересечении с одновременным открытием противоположной позиции. Без стоп лоссов, ТР и доливок. Пытался найти в просторах нета ничего подобного не нашел. Пытаюсь сделать самостоятельно но он не работает. Может кто нибудь глянет и подскажет чего не так. Код прилагается. //+------------------------------------------------------------------+ //| Mar.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ extern double Lots = 0.1; // Это переменные, которые будут // отображаться во время // соединения эксперта с графиком //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double MA_Fast,MA_Low; int total, ticket, cnt; // Просто переменные для использования в программе // присвоение переменным значений MA_Fast=iMA( NULL, 0, 1, 0, MODE_SMA, PRICE_TYPICAL, 1); // быстрая МА MA_Low=iMA( NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1); // медленная МА if(Bars<100) { Print("bars less than 100"); return(0); } // Это условие проверяет, есть ли в истории графиков более 100 свечей и если нет, // выдает ошибку. Требуется для того, чтобы обратить ваше внимание на проблему // недостатка информации total=OrdersTotal(); if(total<1) // Эта проверка нужна для того, чтобы не открывать сразу нескольких одинаковых позиций. Если ее не будет, то, скажем, если ваш эксперт срабатывает, когда стохастик находится в зоне перекупленности, то он будет совершать сделку на каждом тике, пока не истратит всю маржу. // Поэтому, чтобы ограничить количество открываемых позиций, ставят данный // ограничитель. Если он стоит, то советник не будет открывать более определенного // количества позиций <х { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // Еще один вспомогательный кусок кода. Если средств на счете недостаточно, он // выдаст ошибку. Данный кусок полностью бесполезен, если советник работает // в реальном времени, но очень полезен при тестинге на истории. { OrderSelect(OrdersHistoryTotal( )-1, SELECT_BY_POS, MODE_HISTORY); // открытие длинной позиции if(MA_Fast>MA_Low && OrderProfit()>=0) { ticket=OrderSend(Symbol(),OP_BUY,Lots*1,Open[0],3,0,"покупка",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // открытие короткой позиции if(MA_Fast<MA_Low && OrderProfit()>=0) { ticket=OrderSend(Symbol(),OP_SELL,Lots*1,Open[0],3,0,"продажа",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // Наконец, мы добрались до самого интересного. Вместо этих иксов, надо вставить // условие, при котором происходит покупка. // Этот блок нужен только для того, чтобы записать в журнале, все ли прошло гладко. // Или, в противном случае, записать ошибку, из-за которой что-то не получилось. // Теперь о выходе. Тут также ничего не изменилось, просто RRRRRRR - условие // закрытия сделки по BUY, ZZZZZZZZ - по SELL return(0); } total=OrdersTotal(); for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) { if(MA_Fast<MA_Low) { OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red); return(0); } } } if(OrderType()==OP_SELL) { if(MA_Fast>MA_Low) { OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red); return(0); } } } } return(0); } Он не открывает ни одной позиции. Заранее спасибо