Ваши вопросы по языку MQL4

AlexeyVik

Программист mql4 mql5
Есть такой код
Код:
for (i=0; i<=OrdersTotal()-1; i++)  
 {     
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
 { 
 if ( (OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic) ) 
 {
 double fir_op_pr = OrderOpenPrice(); 
  if([B]ot[/B]==OP_BUY) 
  {        
   prof = NormalizeDouble((Bid-fir_op_pr),Digits)/Point; }
  if ([B]ot [/B]== OP_SELL)   
   {
   prof = NormalizeDouble((fir_op_pr-Ask),Digits)/Point; } 
  break;
  }
  }
  }
Подскажите, пожалуйста, почему на бай работает всё как надо, а на селл - нет? Дальше код не привожу, потому что будет непонятно всё равно принцип работы - долго объяснять. Но на бай работает правильно!А на селл - нет...
Если я правильно понял ot = OrderType();
Но нигде этого нет. Получается так, что ot = 0 и OP_BUY тоже = 0 в этом случае работает. А OP_SELL = 1 при ot = 0 условие не выполняется, вот и не работает.
 

strannik-ps

VIP-участник
А условия что за секрет? проще на практики пояснить чем на пальцах.
 

Алекc1234

Местный житель
Если я правильно понял ot = OrderType();
Но нигде этого нет. Получается так, что ot = 0 и OP_BUY тоже = 0 в этом случае работает. А OP_SELL = 1 при ot = 0 условие не выполняется, вот и не работает.

Да, я забыл, до цикла я пишу, что ot = OrderType();
 

strannik-ps

VIP-участник
В программе логика правильно одо может быть не то правильность открытия 2 пипса уже проблема на бай задумайтесь
 

Алекc1234

Местный житель
В программе логика правильно одо может быть не то правильность открытия 2 пипса уже проблема на бай задумайтесь

Ставится отложенный стоп ордер - при его открытии и происходит расчёт в этом куске кода...
 

Алекc1234

Местный житель
Ну покажи как это у тебя сейчас написано.

Вот так сейчас написал
PHP:
for (i=0; i<=OrdersTotal()-1; i++)  
 {     
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
 { 
 if ( (OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic) ) 
 {
 int ot = OrderType();
 double fir_op_pr = OrderOpenPrice(); 
  if(ot==OP_BUY)      prof = NormalizeDouble((Bid-fir_op_pr),Digits)/Point; 
  if (ot == OP_SELL)   prof = NormalizeDouble((fir_op_pr-Ask),Digits)/Point;    
 breek;
 }
 }
 }
Вместо ot = OrderType(); писал и if(OrderType()==OP_BUY)
if(OrderType()==OP_SELL)
все равно не то
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Убрал break - то же самое
Ну наверное ты хочешь увидеть не то что там написал...
Прокомментируй каждую строку. Может тогда разберёшься что должно там получиться.
И ещё одно замечание: Не надо объявлять переменные в теле цикла.
int ot = OrderType();
double fir_op_pr = OrderOpenPrice();

ДО цикла int ot; double fir_op_pr;
А в теле цикла только присваивание им значений.
ot = OrderType();
fir_op_pr = OrderOpenPrice();
 

strannik-ps

VIP-участник
Вот так сейчас написал
PHP:
for (i=0; i<=OrdersTotal()-1; i++)  
 {     
 if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
 { 
 if ( (OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic) ) 
 {
 int ot = OrderType();
 double fir_op_pr = OrderOpenPrice(); 
  if(ot==OP_BUY)      prof = NormalizeDouble((Bid-fir_op_pr),Digits)/Point; 
  if (ot == OP_SELL)   prof = NormalizeDouble((fir_op_pr-Ask),Digits)/Point;    
 breek;
 }
 }
 }
Вместо ot = OrderType(); писал и if(OrderType()==OP_BUY)
if(OrderType()==OP_SELL)
все равно не то

Давайте подумаем заново а не проще ли сделать так?\
1 Стоп ордер
//+------------------------------------------------------------------+
void BuyStop1()
{
double ldStop=0, ldTake=0;
double pAsk=Ask+Delta*point;
//----
if (!ExistOrder(1)) {
if (StopLoss!=0) ldStop=pAsk-StopLoss*point;
if (TakeProfit!=0) ldTake=pAsk+TakeProfit*point;
SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake,1);
}
}
//+------------------------------------------------------------------+
void SellStop1()
{
double ldStop=0, ldTake=0;
double pBid=Bid-Delta*point;
//----
if (!ExistOrder(2)) {
if (StopLoss!=0) ldStop=pBid+StopLoss*point;
if (TakeProfit!=0) ldTake=pBid-TakeProfit*point;
SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake,2);
}
}
//+------------------------------------------------------------------+
bool ExistOrder(int mn) {
bool Exist=False;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic+mn) {
Exist=True; break;
}
}
}
return(Exist);
}
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) {
color clOpen;
if (op==OP_BUYSTOP) clOpen=Blue;
else clOpen=Red;
OrderSend(Symbol(),op,Lots,pp,0,ldStop,ldTake,CommentOrder,Magic+mn,0,clOpen);
Sleep(10000);
RefreshRates();
}
//+------------------------------------------------------------------+
самый простой лучшего прогера Кима! и Не будет запарки
 

Алекc1234

Местный житель
strannik-ps, это конечно, хорошо, только у меня идёт подсчёт профита в пунктах и исходя из этого происходит закрытие ордера...
 

Алекc1234

Местный житель
А скажи мне. Одновременно могут быть открыты и бай и сел?

Такое у меня бывает, но редко, а я это не учитываю - вижу только тогда ошибку когда открыто одно направление - или только бай или только селл...Вернее, на бай ошибки то и нету, только на селл...
 
Последнее редактирование:
Верх