2 действия с 1 кнопки клавиатуры, как реализовать? - страница 3

 

Taras Slobodyanik:
не могу ничего сказать - вижу каждый раз разные куски кода)
что там и как - нужно вызывать телепатов)


Пожалуйста посмотрите, код кажется огромным но это не так, сейчас при нажатии на клавишу Щ(O) меняется безубыток, прошу вас исправьте строчку в int OnInit():

#property copyright "Copyright 2018, 1AM2"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern double Profit=0.0;         //Сумма стредств в валюте депозита, которую нужно получить после закрытия позиций
extern int MagicNumber = 0;       //Фильтр по идентификатору советников
extern color ColorBuy = DarkBlue;
extern color ColorSell = FireBrick;

string NameBuy = "LineBuy";
string NameSell = "LineSell";


bool draw;

extern string           Show_true="O";        // Описание объектов




//сам индюк
double ProfitPrice(string fSymbol, int fType, int fMagic=0, double MyProfit=0.0){
   //Функция возвращает цену, на которую необходимо установить уровень TakeProfit, чтобы получить прибыль MyProfit
   double SummPrice=0.0, SummLots=0.0, Formula=0.0, SummLoss=0.0;
   int k;
   int total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==fSymbol) {
         if(OrderMagicNumber()==fMagic || fMagic==0) {
            if(OrderType()==fType) {
               k++;
               SummLots=SummLots+OrderLots();
               SummPrice=SummPrice+OrderOpenPrice()*OrderLots();
               SummLoss=SummLoss+OrderCommission()+OrderSwap();
            }
         }
      }
   }//Next i  
   
   if(k>0){
      if(fType==OP_BUY){
         Formula = SummPrice/SummLots + 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      } else {
         Formula = SummPrice/SummLots - 
         (MyProfit-SummLoss) * MarketInfo(fSymbol, MODE_POINT) / 
         (MarketInfo(fSymbol, MODE_TICKVALUE) * SummLots);
      }
   }
   
   return(Formula);
}//ProfitPrice()
//+------------------------------------------------------------------+
void ProfitPrice2(string fSymbol, int fMagic=0, double MyProfit=0.0){
   double BuyLots=0.0, SellLots=0.0, BuyProfit=0.0, SellProfit=0.0, BuyPrice=0.0, SellPrice=0.0;
   int total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==fSymbol) {
         if(OrderMagicNumber()==fMagic || fMagic==0) {
            if(OrderType()==OP_BUY){
               BuyLots = BuyLots + OrderLots();
               BuyProfit = BuyProfit + OrderProfit() + OrderCommission() + OrderSwap();
            }else if(OrderType()==OP_SELL){
               SellLots = SellLots + OrderLots();
               SellProfit = SellProfit + OrderProfit() + OrderCommission() + OrderSwap();
            }
         }
      }
   }//Next i  
   double TickValue = MarketInfo(fSymbol, MODE_TICKVALUE);
   if ((BuyLots - SellLots) > 0) {
      BuyPrice = Bid - ((BuyProfit + SellProfit - MyProfit) / (TickValue * (BuyLots - SellLots)) * Point);
   }
   if ((SellLots - BuyLots) > 0) {
      SellPrice = Ask + ((BuyProfit + SellProfit - MyProfit) / (TickValue * (SellLots - BuyLots)) * Point);
   }
   if((BuyLots - SellLots) == 0.0){
      if(BuyLots>0) BuyPrice = Bid - ((BuyProfit + SellProfit - MyProfit) / (TickValue * BuyLots) * Point); //уровень безубытка для всех BUY ордеров
      if(SellLots>0) SellPrice = Ask + ((SellProfit + BuyProfit - MyProfit) / (TickValue * SellLots) * Point); //уровень безубытка для всех SELL ордеров
   }
   SetPriceLine(BuyPrice, NameBuy, ColorBuy);
   SetPriceLine(SellPrice, NameSell, ColorSell);   
}//ProfitPrice2()
//+------------------------------------------------------------------+
void SetPriceLine(double Price=0.0, string NameLine = "MyLine", color ColorLine = DarkOliveGreen){
   int indWnd=0;
   //hWnd = WindowFind(window);
   if (ObjectFind(NameLine)==-1) ObjectCreate(NameLine, OBJ_HLINE, indWnd, 0, Price);
   if(Price==0.0){
      ObjectDelete(NameLine);
   }else{
      ObjectSet(NameLine, OBJPROP_PRICE1, Price);
      ObjectSet(NameLine, OBJPROP_COLOR, ColorLine);
   }
}//SetPriceLine()
//+------------------------------------------------------------------+
//сам индюк




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   if (ObjectFind(0,"NameSell")>=0)
      draw=false;
   else
      draw=true;
//---

   return(INIT_SUCCEEDED);
  }
  
  
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) 
{   
      if(reason != 3) 
      {
         ObjectDelete("NameBuy");
         ObjectDelete("NameSell");
      }
}

//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                  )
  {
  
  
  
//--- нажатие кнопки на клавиатуре 
   if(id==CHARTEVENT_KEYDOWN)
     {
      //--- Уровень безубытка
      if(lparam==(StringGetChar(Show_true,0)))
      {
         if(draw)
              {
                  int    counted_bars=IndicatorCounted();
                  double PB = ProfitPrice(Symbol(), OP_BUY,  MagicNumber, Profit);
                  double PS = ProfitPrice(Symbol(), OP_SELL, MagicNumber, Profit);
                  SetPriceLine(PB, NameBuy,  ColorBuy);
                  SetPriceLine(PS, NameSell, ColorSell); 
                  draw=false;
            }
         else
            {
                  ProfitPrice2(Symbol(), MagicNumber, Profit);     
                  draw=true;
           }
      }
      //--- Уровень безубытка   
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+




 
Да, точно! Надо под одну кнопку засунуть бай и селл, чтобы не напрягаться передвигом пальца! Просто долбить по одной кнопке!
 

Так как две линии могут быть в обоих режимах, то для проверки нельзя использовать тоже самое имя.

вот, немного "распутал"

Файлы:
tmp.mq4  16 kb
 
Yury Kirillov:
Да, точно! Надо под одну кнопку засунуть бай и селл, чтобы не напрягаться передвигом пальца! Просто долбить по одной кнопке!


че уж там, сразу 3 кнопки: Бай, Селл, Закрыть все.

 
Taras Slobodyanik:

Так как две линии могут быть в обоих режимах, то для проверки нельзя использовать тоже самое имя.

вот, немного "распутал"

ОГРОМЕДНЕЙШЕЕ Спасибо))) всё прекрасно работает))) спасибо!!!!

Можно ли, вообще существует такая возможность, чтобы при нажатии 3-го раза полностью убирались линии?
или посредством if и else такое нереально сделать?
 
Dmitry Ivkin:

Можно ли, вообще существует такая возможность, чтобы при нажатии 3-го раза полностью убирались линии?

или посредством if и else такое нереально сделать?

конечно можно, переделать флаг с буула на инт, и везде добавить третье условие

 
Taras Slobodyanik:

конечно можно, переделать флаг с буула на инт, и везде добавить третье условие

могли бы вы еще добавить 3-е условие, или хотя бы кинуть любой пример где есть 3-е условие
Я пытаюсь сам добавить но пишет мол if и else может быть только одно, мол 3-го else не может быть. 

 
Dmitry Ivkin:

могли бы вы еще добавить 3-е условие, или хотя бы кинуть любой пример где есть 3-е условие
Я пытаюсь сам добавить но пишет мол if и else может быть только одно, мол 3-го else не может быть. 


тогда Вам поможет switch 

 
Dmitry Ivkin:

могли бы вы еще добавить 3-е условие, или хотя бы кинуть любой пример где есть 3-е условие
Я пытаюсь сам добавить но пишет мол if и else может быть только одно, мол 3-го else не может быть. 

if () 
  {}
else if () 
  {}
else if () 
  {}
...
 
Taras Slobodyanik:

СпасибО!!!))))