Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1069
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
CloseAllBuy() вызывается в одном-единственном месте: в ф-и OnTick() по условию if(Bid>buycloseprice) CloseAllBuy(); И это условие при новом включении не наступило и в период отключения тоже не наступало, а ф-я CloseAllBuy() все равно сработала при повторном включении эксперта.
Вот кусок кода:
не видно
Вопрос: подскажите пожалуйста, как конкретно в данном случае применить глобальную переменную. Никак не соображу. Спасибо.
Читайте документацию Глобальные переменные терминала, загляните в справку метаедитора, там более оперативно обновляется.
Как вариант, можно настройки и значения важных переменных скидывать в файл, потом при занрузке считывать оттуда.
А чаще всего можно обойтись без всего этого, просто немного поломать голову и составить правильную логику в коде.
total=OrdersTotal();
if(total>0)
{
for(int i=0; i<=OrdersTotal(); i++)
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderType()==OP_BUY && OrderMagicNumber()==magic)
{ RefreshRates();
if(Bid>buycloseprice) CloseAllBuy();
}
if(OrderType()==OP_SELL && OrderMagicNumber()==magic)
{ RefreshRates();
if(Ask<sellcloseprice) CloseAllSell();
}
}
}
if((total==0) || (total>0 && OrderSelect(1,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!=Symbol()))
{
Comment("Нет открытых позиций");
if(условие && timeBar!=iTime(Symbol(),Period(),1))
{
Print("Появился критерий-1 для БАЙ");
int poz_1 = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0,NULL,magic,Blue);
Sleep(1000);
RefreshRates();
int poz_2 = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0,NULL,magic,Blue);
Sleep(1000);
RefreshRates();
int poz_3 = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0,NULL,magic,Blue);
Sleep(1000);
RefreshRates();
int poz_4 = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0,NULL,magic,Blue);
Sleep(1000);
RefreshRates();
int poz_5 = OrderSend(Symbol(),OP_BUY,lot,Ask,slip,0,0,NULL,magic,Blue);
timeBar=iTime(Symbol(),Period(),1);
double spread = (Ask-Bid);
buyopentime = iTime(Symbol(),Period(),0);
buycloseprice = NormalizeDouble((iOpen(Symbol(), Period(), 0)+spread+75*Point), Digits);
Comment("Magic 510015 БАЙ");
Print("ЦЕНА ЗАКРЫТИЯ = ",buycloseprice);
}
}
}
//+------------------------------------------------------------------+*/
void CloseAllBuy()
{
bool fc;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderType()==OP_BUY)
{
fc=OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slip);
buycloseprice=0.0;
tc=OrderCloseTime();
}
}
}
Повторяю текстом:
Всё ещё не ясно, откуда берётся buycloseprice, что с ним происходит до условия if(Bid>buycloseprice) CloseAllBuy();. Потому что я вижу в коде только это, уже после - buycloseprice = NormalizeDouble((iOpen(Symbol(), Period(), 0)+spread+75*Point), Digits);, но где этот самый buycloseprice объявлен и каким значением инициализарован?
Если это - предполагаемая цена закрытия ордера на покупку, то логика ломается уже здесь, так как значение передаётся переменной уже после того как она сработала, а что в ней бюло раньше вы не показали.
Теперь немного арифметики, есть там в коде такой цикл:
for(int i=0; i<=OrdersTotal(); i++)
допустим, ордеров 5 - от 0 до 4. А цикл считает от 0 до 5. Будет ли этот цикл правильно работать?
Ещё, в строке if(условие && timeBar!=iTime(Symbol(),Period(),1)), откуда берутся условие и timeBar?