Добрый день. Нужен простой советник который бы открывал позицию при пересечении 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);
}
Он не открывает ни одной позиции.
Заранее спасибо