Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 37

 
ed3sss:

OK, é o mesmo ciclo aqui, por que fecha os pedidos?)

Porque ele pode. Mas a escrita ainda é analfabeta.
 
Vitalie Postolache:
Porque ele pode. Mas ainda é analfabeto.
Sugira-o corretamente! se você não poupar seus conhecimentos.
 
ed3sss:
Sugira inteligentemente! se você não poupar seus conhecimentos.

Aqui está uma versão um pouco mais correta, que ainda tem espaço para melhorias:

        int error=0;
        for(i=OrdersTotal()-1;i>=0;i--)
        {//+----------------------------------------------------------------------------------------+for
         if(!OrderSelect(i,SELECT_BY_POS)) continue;
         if(OrderSymbol()!=Symbol())continue;
         if(OrderType()>1)continue;
         RefreshRates();
         if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3))
          {
           error=_LastError;
           Print("Error #",error);
          }
         if(error==6){Alert("Нет связи");return(0);}
         if(error==132){Alert("Рынок закрыт");return(0);}
        }
 
//+----------------------------------------------------------------------------+
//|                                                   i-TotalStopCurrency.mq4  |
//|  21.12.2011  Indicator of the Total Stop in the Deposit Currency.          |
//|              Индикатор суммарного стопа в валюте депозита.                 |
//|  04.05.2012  Добавил способ расчета прибыли для Futures.                   |
//+----------------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 0

//------- Внешние параметры индикатора ----------------------------------------+
extern string symbol   = "";
extern color  ecText   = Black;    // Цвет текста
extern int    eiCorner = 3;       // Номер угла привязки:
                                  //   0 - левый верхний
                                  //   1 - правый верхний
                                  //   2 - левый нижний
                                  //   3 - правый нижний

//------- Глобальные переменные индикатора ------------------------------------+


//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПРЕДОПРЕДЕЛЁННЫЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Custom indicator initialization function                                  |
//+----------------------------------------------------------------------------+
void init() {
  Comment("");
}

//+----------------------------------------------------------------------------+
//|  Custom indicator deinitialization function                                |
//+----------------------------------------------------------------------------+
void deinit() {
  Comment("");
  for (int i=0; i<3; i++) ObjectDelete("iTotalStopCurrency"+i);
}

//+----------------------------------------------------------------------------+
//|  Custom indicator iteration function                                       |
//+----------------------------------------------------------------------------+
void start() {
  double s=ProfitIFStopInCurrency(symbol);
  int pn=ProfitIFStopInCurrency2(symbol);
  
  SetLabel("iTotalStopCurrency0", "Уровень стопа", ecText, 5, 30, eiCorner);
  SetLabel("iTotalStopCurrency1", DoubleToStr(s, 2)+" "+AccountCurrency(), ecText, 5, 5, eiCorner);
  SetLabel("iTotalStopCurrency2", "Спр="+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0)+" Орд="+OrdersTotal()
  +" Приб="  +DoubleToStr(AccountProfit(),2)+" Сред="+DoubleToStr(AccountEquity(),2)+" Бал="+DoubleToStr(AccountBalance(),2)+"  "+pn
  +"пипс "+DoubleToStr(s/AccountBalance()*100, 2)+"%", ecText, 130, 5, eiCorner);
}
//+----------------------------------------------------------------------------+
//|  Версия   : 03.05.2012                                                     |
//|  Описание : Возвращает предполагаемую прибыль/убыток в валюте депозита     |
//|             в случае срабатывания стопа открытых позиций.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double ProfitIFStopInCurrency(string sy="", int op=-1, int mn=-1) {
  /*if (sy=="0") */ sy=Symbol();  // Текущий символ
  int    i, k=OrdersTotal(); // Подсчёт открытых позиций
  int    m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
  double l;                  // Размер контракта в базовой валюте инструмента
  double p;                  // Размер пункта в валюте котировки
  double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
  double v;                  // Размер минимального изменения цены инструмента в валюте депозита
  double s=0;                // Подсчёт стопа в валюте депозита
  double pn=0;               // Подсчёт стопа в пунктах

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
          m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
          v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
          if (OrderType()==OP_BUY) {
            if (m==0) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots(); pn-=(OrderOpenPrice()-OrderStopLoss())*MathPow(10,MarketInfo(OrderSymbol(),MODE_DIGITS));
            if (m==1) s-=(OrderOpenPrice()-OrderStopLoss())/p*v/t/l*OrderLots();
            if (m==2) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
            s+=OrderCommission()+OrderSwap();
          }
          if (OrderType()==OP_SELL) {
            if (OrderStopLoss()>0) {
              if (m==0) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots(); pn-=(OrderStopLoss()-OrderOpenPrice())*MathPow(10,MarketInfo(OrderSymbol(),MODE_DIGITS));
              if (m==1) s-=(OrderStopLoss()-OrderOpenPrice())/p*v/t/l*OrderLots();
              if (m==2) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
              s+=OrderCommission()+OrderSwap();
            } else s=-AccountBalance();
          }
        }
      }
    }
  }
  if (AccountBalance()+s<0) s=-AccountBalance(); // Ограничение убытка балансом счёта
  return(s);
}
//+----------------------------------------------------------------------------+
double ProfitIFStopInCurrency2(string sy="", int op=-1, int mn=-1) {
  /*if (sy=="0") */ sy=Symbol();  // Текущий символ
  int    i, k=OrdersTotal(); // Подсчёт открытых позиций
  int    m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
  double l;                  // Размер контракта в базовой валюте инструмента
  double p;                  // Размер пункта в валюте котировки
  double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
  double v;                  // Размер минимального изменения цены инструмента в валюте депозита
  double s=0;                // Подсчёт стопа в валюте депозита
  double pn=0;               // Подсчёт стопа в пунктах

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((OrderType()==OP_BUY || OrderType()==OP_SELL) && (op<0 || OrderType()==op)) {
          l=MarketInfo(OrderSymbol(), MODE_LOTSIZE);
          m=MarketInfo(OrderSymbol(), MODE_PROFITCALCMODE);
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          t=MarketInfo(OrderSymbol(), MODE_TICKSIZE);
          v=MarketInfo(OrderSymbol(), MODE_TICKVALUE);
          if (OrderType()==OP_BUY) {
            if (m==0) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots(); pn-=(OrderOpenPrice()-OrderStopLoss())*MathPow(10,MarketInfo(OrderSymbol(),MODE_DIGITS));
            if (m==1) s-=(OrderOpenPrice()-OrderStopLoss())/p*v/t/l*OrderLots();
            if (m==2) s-=(OrderOpenPrice()-OrderStopLoss())/p*v*OrderLots();
            s+=OrderCommission()+OrderSwap();
          }
          if (OrderType()==OP_SELL) {
            if (OrderStopLoss()>0) {
              if (m==0) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots(); pn-=(OrderStopLoss()-OrderOpenPrice())*MathPow(10,MarketInfo(OrderSymbol(),MODE_DIGITS));
              if (m==1) s-=(OrderStopLoss()-OrderOpenPrice())/p*v/t/l*OrderLots();
              if (m==2) s-=(OrderStopLoss()-OrderOpenPrice())/p*v*OrderLots();
              s+=OrderCommission()+OrderSwap();
            } else s=-AccountBalance();
          }
        }
      }
    }
  }
  if (AccountBalance()+s<0) s=-AccountBalance(); // Ограничение убытка балансом счёта
  return(pn);
}
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний )                    |
//|                                     1 - правый верхний                     |
//|                                     2 - левый нижний                       |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=14) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+

Olá !

O indicador dado funciona bem quando eu o coloco em um gráfico

Mas depois de reiniciar o terminal, não há dados, apenas algo em vez de dados

eu posso consertá-lo mudando a TF

eu tentei tudo o que sei - não funciona

Acho que a definição do rótulo do texto é algo errado - ajude, por favor, agradeça antecipadamente!

 
Игорь:
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=14) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+

Olá !

O indicador dado funciona bem quando eu o coloco em um gráfico

Mas depois de reiniciar o terminal, não há dados, apenas algo em vez de dados

eu posso consertá-lo mudando a TF

eu tentei tudo o que sei - não funciona

Acho que a definição do rótulo do texto é algo errado - por favor me ajude, obrigado de antemão!

Talvez sim?

void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=14) {
  if (ObjectFind(nm)<0) {
   ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
   ObjectSet(nm, OBJPROP_COLOR    , cl);
   ObjectSet(nm, OBJPROP_XDISTANCE, xd);
   ObjectSet(nm, OBJPROP_YDISTANCE, yd);
   ObjectSet(nm, OBJPROP_CORNER   , cr);
   ObjectSet(nm, OBJPROP_FONTSIZE , fs);
  }
   ObjectSetText(nm, tx, fs);
}
 
Vitaly Muzichenko:

Que tal isso?

void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=14) {
  if (ObjectFind(nm)<0) {
   ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
   ObjectSet(nm, OBJPROP_COLOR    , cl);
   ObjectSet(nm, OBJPROP_XDISTANCE, xd);
   ObjectSet(nm, OBJPROP_YDISTANCE, yd);
   ObjectSet(nm, OBJPROP_CORNER   , cr);
   ObjectSet(nm, OBJPROP_FONTSIZE , fs);
  }
   ObjectSetText(nm, tx, fs);
}


Obrigado pela atenção, mas o resultado é o mesmo!

Talvez isto ajude! Não há 3º e 2º não está certo!

Depois de mudar a TF, é normal!

Arquivos anexados:
1.jpg  439 kb
 
Então ajude o mesmo com o problema - ele ainda não foi resolvido!
 
Boa tarde. Instalei o MT4 no meu computador. Coloque-o no drive D para um propósito. Mas teimosamente cria uma pasta de dados na unidade C. O espaço ali não é suficiente, como de costume, então tenho que limpar os registros do testador várias vezes ao dia durante os testes. Bem, não pode ser fatal, pode? Você pode aconselhar um dummie como fazer o MT4 criar uma pasta "diretório de dados" em outra unidade? Não consigo encontrá-lo em Settings.
 
VHS:
Boa tarde. Instalei o MT4 no meu computador. Propositalmente, coloque-o no drive D. Mas teimosamente cria uma pasta de dados na unidade C. O espaço ali não é suficiente, como de costume, então tenho que limpar os logs do testador ao testar várias vezes ao dia. Bem, não pode ser fatal, pode? Você pode aconselhar um dummie como fazer o MT4 criar uma pasta "diretório de dados" em outra unidade? Não consigo encontrá-lo em Settings.

Eu não sou profissional, mas acho que não há nada que o Sim possa fazer!

Apenas libere o drive c ou reinstale tudo com o vento e faça mais!

 
VHS:
Boa tarde. Instalei o MT4 no meu computador. Coloque-o no drive D para um propósito. Mas teimosamente cria uma pasta de dados na unidade C. O espaço ali não é suficiente, como de costume, então tenho que limpar os registros do testador várias vezes ao dia durante os testes. Bem, não pode ser fatal, pode? Você pode aconselhar um dummie como fazer o MT4 criar uma pasta "diretório de dados" em outra unidade? Não consigo encontrá-lo em Settings.
Eu também não sei como usar o mecanismo de busca. Tem sido escrito sobre o modo /portável inúmeras vezes neste e em outros fóruns. O problema já tem três anos de existência.