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

star603

Новичок форума
что код должен выдавать в том месте где выдаёт значение прибыли ?
1.jpg
Эти значения должны быть равны. Но почему то есть разница.
Код:
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         Ticket = OrderTicket();
         Symboly = OrderSymbol();
         Type = OrderType();
         Lop = OrderLots();
         switch(Type)
           {
            case 0:
               OrderTipe = "Buy";
               break;
            case 1:
               OrderTipe = "Sell";
               break;
           }
        }
      double SL = OrderStopLoss();
      double TP = OrderTakeProfit();
      double OP = OrderProfit();
      datetime OOP = OrderCloseTime();
      double Op = NormalizeDouble(OrderOpenPrice(),Digits);
      Comment("Тикет ордера =",Ticket,"\n",
              "Валютная пара=",Symboly,"\n",
              "Тип ордера=",OrderTipe,"\n",
              "Лот ордера=",Lop,"\n",
              "Стоплос=",SL,"\n",
              "Тейкпрофит=",TP,"\n",
              "Цена открытия=",Op,"\n",
              "Время закрытия ордера=",OOP,"\n",
              "Приболь ордера=",OP);
     };
 

Абдулхаким

Почетный гражданин
Эти значения должны быть равны. Но почему то есть разница.
для начала помести Comment и всё что ему причитается в скобки, где выбираешь ордер.
и скинь гифку на которой видно как открываются и закрываются ордера и как меняется значение прибыли в Comment и во вкладке "результат"
 

star603

Новичок форума
А где учет профита с учетом свопа и комиссии???
Теперь работает. Теперь буду думать как закинуть в выбор функции. через свич.
Код:
double flot()
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         if(OrderProfit()+OrderCommission()+OrderSwap()>0)
           {
            Lop = OrderLots();
            Lot=Lop*3;
           }
        }
     };
   return(Lot);
  }

А потом так:
Код:
double LOT()//Функция по расчету лота
  {
   if(GetLastError()==0)
     {
      switch(_Lot)
        {
         case 0:
            Lot=Lot;
            break;
         case 1:
            Lot=NormalizeDouble(MathCeil(AccountBalance()/100)/100,2);
            break;
         case 2:
            Lot=NormalizeDouble(MathCeil(AccountEquity()/100)/100,2);
            break;
         case 3:
            Lot=NormalizeDouble((AccountFreeMargin()*RISK)/1000,2);
            break;
         case 4:
            flot();
            break;
        }
     };
   switch(GetLastError())
     {
      case 131:
         Lot=0.01;
         break;
      case 4051://Этот участок почему то на работает когда терминал выдает эту ошибку
         Lot=0.01;
         break;
     }
   return(Lot);
  };

есть места где подредактировать
 

star603

Новичок форума
Сегодня вообще странное произошло. Тот же график и период и тот же код а сделки другие открываются. Почему так может быть?
 

star603

Новичок форума
Код:
void OnTick()
  {

   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      Stopi();
      Comment(SL);
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SL,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SL,0,"S1 sell",Magic,clrNONE);
     }
  }
//---------------------------------------------------------------------------------------
double Stopi()
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               OrderTipe="BUY";
               SL = sltp[2];
               break;
            case 1:
               OrderTipe="SELL";
               SL = sltp[0];
               break;
           }
        };
     }
   return(SL);
  }

Почему-то не работает.
 

star603

Новичок форума
Код:
void OnTick()
  {

   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      Stopi();
      Comment(SL);
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SL,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,SL,0,"S1 sell",Magic,clrNONE);
     }
  }
//---------------------------------------------------------------------------------------
double Stopi()
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               OrderTipe="BUY";
               SL = sltp[2];
               break;
            case 1:
               OrderTipe="SELL";
               SL = sltp[0];
               break;
           }
        };
     }
   return(SL);
  }

Почему-то не работает.
Разобрался работает
 

star603

Новичок форума
Код:
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderOpenPrice()>SL && OrderStopLoss()!= SL && OrderOpenPrice()>TP && OrderTakeProfit()!=TP)
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrYellow);
               break;
            case 1:
               if(OrderOpenPrice()<SL && OrderStopLoss()!= SL)
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrWhite);
               break;
           }
        }
     }
  }
Без этой части работает хорошо, лоссы ставяться:
Код:
&& OrderOpenPrice()>TP && OrderTakeProfit()!=TP

То есть нижняя часть выглядит так:
Код:
ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrYellow);

Почему не работает когда дабавляешь тейк профиты. Профиты и лоси определены правильно.
 

mobidik

-----
Код:
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderOpenPrice()>SL && OrderStopLoss()!= SL && OrderOpenPrice()>TP && OrderTakeProfit()!=TP)
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrYellow);
               break;
            case 1:
               if(OrderOpenPrice()<SL && OrderStopLoss()!= SL)
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrWhite);
               break;
           }
        }
     }
  }
Без этой части работает хорошо, лоссы ставяться:
Код:
&& OrderOpenPrice()>TP && OrderTakeProfit()!=TP

То есть нижняя часть выглядит так:
Код:
ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0,clrYellow);

Почему не работает когда дабавляешь тейк профиты. Профиты и лоси определены правильно.
А что, стоп и тейк по одну и ту же сторону от цены открытия позиции? :)))
 

star603

Новичок форума
Код:
double flot()
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         if(OrderProfit()+OrderCommission()+OrderSwap()>0)
           {
            Lop = OrderLots();
            Lot=Lop*3;
           }
         else
            if(OrderProfit()+OrderCommission()+OrderSwap()<0)
              {
               Lot=Lot;
              }
        }
     };
   return(Lot);
  }

Скажите пожалуйста почему когда положительный приболь в истории у ордера увеличение лота, а уменьшение на фиксированный не идет?
 

star603

Новичок форума
Как отобразить данные как центовый счет? 100$=10000c
 

nadal5739

Новичок форума
i trade some stocks of my country but the data are not on mt4 and i need to extract mt5 data and import it manually to mt4 history center and use offline chart so i delete for example eurusd data and import my data instead so my question is that is there an easier way
 

star603

Новичок форума
Код:
void OnTick()
  {
   Schetorderov();
   Alert(P);
   ViborStopov();
   ViborProfy();
   OrderModifi();
   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      LOT();
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
     }
  }
//++++++++++++double Schetorderov()
  {
   if(OrdersHistoryTotal()>=3)
   {
    for( int i=3;i<4; i--)
    {
     for(int y=0; y<= OrdersHistoryTotal()-1*i; y++)//Начинаем перебор ордеров в истории
     {
      P=OrderLots();
     }
    }
   }
   return(P);
  }+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3 сделки откроет и тестер зависает. Подскажите почему.
 

Ugar

Гуру форума
Код:
void OnTick()
  {
   Schetorderov();
   Alert(P);
   ViborStopov();
   ViborProfy();
   OrderModifi();
   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      LOT();
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
     }
  }
//++++++++++++double Schetorderov()
  {
   if(OrdersHistoryTotal()>=3)
   {
    for( int i=3;i<4; i--)
    {
     for(int y=0; y<= OrdersHistoryTotal()-1*i; y++)//Начинаем перебор ордеров в истории
     {
      P=OrderLots();
     }
    }
   }
   return(P);
  }+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3 сделки откроет и тестер зависает. Подскажите почему.
С циклами полный бред.
for( int i=3;i<4; i--)
В этом цикле нет стопа. i будет уходить в отрицательные значения пока не упрётся в минимальное значение int.

for(int y=0; y<= OrdersHistoryTotal()-1*i; y++)//Начинаем перебор ордеров в истории
Зачем в этом цикле умножить на i?
 

star603

Новичок форума
С циклами полный бред.
for( int i=3;i<4; i--)
В этом цикле нет стопа. i будет уходить в отрицательные значения пока не упрётся в минимальное значение int.

for(int y=0; y<= OrdersHistoryTotal()-1*i; y++)//Начинаем перебор ордеров в истории
Зачем в этом цикле умножить на i?
Я планировал эту идею:
1) уменьшать лот до фиксированного после скажем 3х положительных.

i идея заключалась в том чтобы выбрать лот у последних 3 ордеров в истории.

Подсказкам я буду только рад.
 

star603

Новичок форума
Код:
Stopi2();
OrderModifi();

   if(GetLastError()==130)
   {
       for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if((OrderOpenPrice()>SL && OrderStopLoss()!= SL) || (OrderOpenPrice()<TP && OrderTakeProfit()!=TP))
                   Print(DoubleToString(Bid,Digits),"____",DoubleToString(Bid-SL,Digits),"___",SL,"___","Buy");
               break;
            case 1:
               if((OrderOpenPrice()<SL && OrderStopLoss()!= SL) || (OrderOpenPrice()>TP && OrderTakeProfit()!=TP))
                  Print(DoubleToString(Ask,Digits),"_____",DoubleToString(Ask+SL,Digits),"___",SL,"___","Sell");
               break;
           }
        }
     }
   }
   }

   if(OrdersTotal()==0)
     {
      ue(sltp);
      uo(svecha);
      LOT();
      if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
         ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
      if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
         ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
     }

   gh2[6]=NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);
   gh2[7]=NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);

double Stopi2()
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0.0)
                  SL = sltp[6];
               break;
            case 1:
               if(OrderStopLoss()==0.0)
                  SL = sltp[7];
               break;
           }
        };
     }
   return(SL);
  }
Вроде правильно но выдает ошибку, правда не всегда
2022.12.02 22:56:57.179 2017.11.03 13:38:31 Umr3 AUDCAD,H1: 0.97775_____1.95709___0.97934___Sell
2022.12.02 22:56:57.179 2017.11.03 13:38:31 Umr3 AUDCAD,H1: OrderModify error 130

Я понимаю ошибка в этих 0.97775_____1.95709 Почему так выходит. не знаю как переписать чтобы выводился принт при верных модификациях ордера. Пробывал :
Код:
GetLastError()==0

не помогло.
 

star603

Новичок форума
Почему так сделка открывается над ценой. Из-за спреда?
 

Вложения

  • 1.jpg
    1.jpg
    439 КБ · Просмотры: 23

star603

Новичок форума
Код:
void OnTick()
  {
   Nbar();
   ue(sltp);
   ViborStopov();
   ViborProfy();
   OrderModifi();
   if(f_IsNewBar()==true)
     stg1();
  }
//=======================================================================================
bool f_IsNewBar()//новый бар
  {
   if(intBars != Bars)
     {
      intBars = Bars;
      return(true);
     }
   return(false);
  }
  //***************************************************************************
void OrderModifi()//+
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if((OrderOpenPrice()>SL && OrderStopLoss()!= SL) || (OrderOpenPrice()<TP && OrderTakeProfit()!=TP))
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrYellow);
               break;
            case 1:
               if((OrderOpenPrice()<SL && OrderStopLoss()!= SL) || (OrderOpenPrice()>TP && OrderTakeProfit()!=TP))
                  ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,0,clrWhite);
               break;
           }
        }
     }
  }
//*****************************************************************************
  void stg1()
  {
   uo(svecha);
   LOT();
   TORGI();
   switch(rtorg)
     {
      case 1:
         if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
            ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
         break;
      case 2:
         if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
            ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
         break;
      case 3:
         if(svecha[4][1]<0 && svecha[4][2]<0 && svecha[4][3]<0)
            ticketss=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"S1 buy",Magic,clrNONE);
         if(svecha[4][1]>0 && svecha[4][2]>0 && svecha[4][3]>0)
            ticketss=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"S1 sell",Magic,clrNONE);
         break;
     }
  }
  //*******************************************************************************

Не пойму почему на новом баре идет модификация ордеров и каждый раз разные значения или теже значения. Но если сделать условие открытие ордеров будет OrderTotal()==0 модификация происходит 1 раз.
 

Вложения

  • 1.jpg
    1.jpg
    177,1 КБ · Просмотры: 11
Последнее редактирование:

intersheff

Прохожий
Здравствуйте, я ищу человека, который бы смог мне помочь разрешить проблему с функцией ChartSetSymbolPeriod().
Использую ее при нажатии на кнопке. Переключение между инструментами происходит очень медленно.

Как добиться такого же быстродействия как в платформе , когда мышью перетаскиваешь ордер на график из списка ордеров и переключение происходит моментально.

Если у вас есть опыт в данном направлении , буду благодарен за помощью.
 
Верх