[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 46

 
rustein:

а где, собственно, вопрос?
 
ilunga:
а где, собственно, вопрос?
https://www.mql5.com/ru/forum/115354/page78
 

в приведенном вами коде если есть только 1 ордер, то цикл

for(;Cnt>=0;Cnt--)
    {
      RefreshRates();
      OrderSelect(Cnt,SELECT_BY_POS);
      if(OrderMagicNumber()==Magic)
      {
      TotalOpenOrders++;
      }
    }

выполнится 2 раза. при этом первый раз будет попытка выбора ордера, которого нет

 
ilunga:

в приведенном вами коде если есть только 1 ордер, то цикл

выполнится 2 раза. при этом первый раз будет попытка выбора ордера, которого нет

Спасибо, исправлю для себя.
 
artmedia70:
Терминал ушёл в глубокую задумчивость, минут через 15 я его убил
ничегосебетерпение...
я бы убил не дожидаясь минуты.
 
PapaYozh:

Непосредственно перед использованием Ask и Bid выполните RefreshRates()


Пробовал, ничего не меняется

Функция отправки ордера, вроде все стандартно

 int OpenPosition(string AdvisorName,int Position,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){double Price = NormalizeDouble(Ask,Digits); 
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){Price = NormalizeDouble(Bid,Digits); 
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} RefreshRates(); while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
 
Dimoncheg:


Пробовал, ничего не меняется

Функция отправки ордера, вроде все стандартно


Сначала Вы обновляете цены функцией RefreshRates() и запоминаете требуемую в Price.

Потом выполняете Sleep(Interval), а в это время котировки то меняются.

А после этого вызываете OrderSend() с позапрошлогодней котировкой.

Спрашивается, чего Вы ожидаете получить в ответ?

 
PapaYozh:


Сначала Вы обновляете цены функцией RefreshRates() и запоминаете требуемую в Price.

Потом выполняете Sleep(Interval), а в это время котировки то меняются.

А после этого вызываете OrderSend() с позапрошлогодней котировкой.

Спрашивается, чего Вы ожидаете получить в ответ?


Во косяк, намодернизировал малость не туда, ща сделал вынос цены за пределы фунции

OpenPosition("Sovetneg",OP_BUY,NormalizeDouble(Ask,Digits),Magic,SlowlyIncreasingLots(0.2),MultiStop(OP_BUY,StopLoss));
Сама функция теперь
 int OpenPosition(string AdvisorName,int Position,double Price,int Magic,double Lots,double StopLoss){ 
 int N; int Сount = 5; int Slippage = (CalculateSpread() * 2); 
 string PeriodString = GetPeriod(Period());
 if(Position == OP_BUY){
 string OrderName = " - Покупка по рынку";
 string ErrorName = "Ошибка открытия ордера на покупку";
 string CriticalErrorName = "Невозможно открыть ордер на покупку";
 string MailCriticalErrorName = "Ошибка открытия"; color Arrow = Gold;}
 if(Position == OP_SELL){
 OrderName = " - Продажа по рынку"; ErrorName = "Ошибка открытия ордера на продажу";
 CriticalErrorName = "Невозможно открыть ордер на продажу";
 MailCriticalErrorName = "Ошибка открытия"; Arrow = YellowGreen;}
 
 while(IsTradeContextBusy() || !IsTradeAllowed()){int Interval = MathRand()+1000; 
 Print("Торговый поток занят. Повторная проверка через "+DoubleToStr((Interval/1000),0)+" сек"); 
 Sleep(Interval);} while(N < Сount){RefreshRates(); 
 int Ticket = OrderSend(Symbol(),Position,Lots,Price,Slippage,StopLoss,0,AdvisorName+
 OrderName,Magic,0,Arrow);
 if(Ticket > 0){if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){int Flag = 1; 
 PlaySound("recharge.wav"); break;}}
 else{Flag = 0; int PRM = GetLastError(); string ERR = Error(PRM,"OrderSend()"); 
 ErrorProcessing(AdvisorName+" "+PeriodString,ErrorName+" "+PRM+" ("+
 Error(PRM,"OrderSend()")+")","","OrderSend()"); N++; Sleep(5000);}
 if(N == Сount){ErrorProcessing(AdvisorName+" "+PeriodString,CriticalErrorName,
 MailCriticalErrorName+" "+PRM+" ("+Error(PRM,"OrderSend()")+")","OrderSend()");}}
 return(Flag);}
Теперь вроде правильно?
 

Здравствуйте.

Не подскажите, что значит type==4

и type==5

в следующем фрагменте:

double ma=iMA(Symbol(),PERIOD_D1,21,0,MODE_SMA,PRICE_CLOSE,0);

for(int k=1; k<=OrdersTotal(); k++)
bool select=OrderSelect(k-1,SELECT_BY_POS);

if(select)
{
int type=OrderType();
int ticket=OrderTicket();

if (Bid<ma && type==4)
OrderDelete(ticket);
if (Bid>ma && type==5)
OrderDelete(ticket);
}

Понимаю, что условия удаления ордеров, по ma понятно, а вот вместе как ?

Спасибо.

 
Dimoncheg:


Теперь вроде правильно?


Нет не правильно. Стало еще хуже :)

Поймите, RefreshRates() обновляет значения предопределённых переменных Ask и Bid, Вы же используете значение когда-то запомненное в переменную Price.

Причина обращения: