Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 486

 
evillive:

Se você pegar seu número 108, você chegará no máximo a 151 ao poder de 151 - 108^151=1.11426138071861e+307

108^152=1.20340229117609e+309 é demais para a programação MCL, quanto mais 108^4096

Que tipos de cálculos exigiriam tal escala?


Estou tentando sintetizar a análise do movimento de preços e a gestão da atenção nlp, e o cérebro em piloto automático :)
 
alex12:
Estou tentando sintetizar a análise do movimento de preços e a gestão da atenção nlp, e meu cérebro está em piloto automático :)
Na busca pelo esclarecimento, o principal é escolher as substâncias certas para não voar muito longe.
 

Comecei a aprender MQL4 e não consigo entender como um pedido é selecionado

do tutorial:

for(int i=1; i<=OrdensTotal(); i++) // Laço de encomenda

{

se (OrderSelect(i-1,SELECT_BY_POS)==verdadeiro) // Se

{

se (OrderSymbol()!= Symb) continuar;

Meu entendimento é: Para i=1 desde que i<= Número de pedidos

Se a ordem selecionada na posição i-1(i.e. ordem #0) existir

Compará-lo com o símbolo

Então adicione 1(i++) ao i e inicie uma nova iteração

Eu não entendo o comentário // Se houver uma próxima ordem (o que você quer dizer: próxima por posição ou esta ordem que está sendo selecionada atualmente?)

Por favor, explique em russo.

 
Se houver uma ordem, ou seja, existe sob o número e 1, então vá para a condição seguinte.
 
Vladon:
Se houver uma ordem, ou seja, existe sob o número e 1, então vá para a condição seguinte.

Sempre encontrará um pedido com o número zero (que é i-1). Que método louco para determinar a "próxima" ordem, verdadeiramente enganosa...
 
Obrigado pelas explicações.
 
evillive:

Sempre encontrará um pedido com número zero (que é i-1). Este é um método selvagem de determinar a "próxima" ordem, o que é verdadeiramente enganoso...


Se não houver encomendas, então com este projeto:

for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;

não irá para a condição seguinte.

porque não há ordem e-1 (no nosso caso =0)

É claro que não é conveniente escrevê-lo desta maneira e não está claro porque deveria ser assim,

e não, por exemplo, desta forma:

for(int i=0; i<OrdersTotal(); i++) // Цикл перебора ордер

{

if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий

{ 

if (OrderSymbol()!= Symb) continue;
 

Olá Sr. programador, tenho uma pergunta, não posso aprender uma parte do código para fechar a porcentagem do saldo da conta. fecha não a porcentagem, mas todas de uma só vez e todas as ordens que estão no mercado. preciso que feche uma ordem específica e a porcentagem calculada do saldo do depósito.aconselha o que eu faço de errado?


duplo Porcentagem externa = 2,0;
externa int Slippage = 2;
parada dupla;

vazio OnStart()
{

if (Dígitos == 3 || Dígitos == 5)
{
Slippage *= 10;
}

for(int i = OrderTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY || OrderType() == OP_SELLL)
{
if(stop===AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;
if(stop<=AccountBalance())
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}////(ostop==AccountBalance()/100*Percent)
}//// (OrderSymbol() == Symbol() )
}// (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//// for(int i = OrderTotal()-1; i>=0; i--)
return;
} void OnStart()
//+

 
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);

como é isso?

e isto:

if(stop==AccountBalance()/100*Percent)
stop=AccountBalance()/100*Percent;

nunca será cumprida.

portanto:

if(stop<=AccountBalance())

sempre funcionará com cada pedido.

CONCLUSÃO: tudo está errado.

Sua função precisa ser pensada, eu não tenho uma resposta rápida.

mas pelo menos é assim, para começar:

extern double Percent = 2.0;
extern int Slippage = 2;
double stop;

void OnStart()
{

if (Digits == 3 || Digits == 5)
{
Slippage *= 10;
}

for(int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol()) 
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(OrderProfit()>=AccountBalance()/100*Percent)

{
if(OrderType() == OP_SELL)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Aqua);
if(OrderType() == OP_BUY)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Aqua);
}//if(ostop<=AccountBalance())
}//if(ostop==AccountBalance()/100*Percent)
}//if (OrderSymbol() == Symbol() )
}//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
}//for(int i = OrdersTotal()-1; i>=0; i--)
return;
}//void OnStart()
//+-----------------------------------------------------------------
 
Vladon:


Se não houver encomendas em tal construção:

não irá para a condição seguinte.

porque não há ordem e-1 (no nosso caso =0)

É claro que não é conveniente escrevê-lo desta maneira e não está claro porque deveria ser assim,

e não, por exemplo, assim:


Quando eu estava lendo, também pensei por que não colocar apenas i=0, parece ser mais simples e claro.

Aqui está todo o código do roteiro, talvez haja uma boa razão para o autor ter colocado i=1 em vez de i=0. Eu simplesmente não sei o suficiente sobre isso e posso simplesmente não vê-lo, enquanto eu preciso entender o mecanismo de funcionamento para não levantar questões mais tarde

// closeorder.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
int start()                                     // Спец.функция start
  {
   string Symb=Symbol();                        // Финанс. инструмент
   double Dist=1000000.0;                       // Предустановка
   int Real_Order=-1;                           // Пока рыночных нет
   double Win_Price=WindowPriceOnDropped();     // Здесь брошен скрипт
//--------------------------------------------------------------- 2 --
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         //------------------------------------------------------ 3 --
         if (OrderSymbol()!= Symb) continue;    // Не наш фин.инструм.
         int Tip=OrderType();                   // Тип ордера
         if (Tip>1) continue;                   // Отложенный ордер  
         //------------------------------------------------------ 4 --
         double Price=OrderOpenPrice();         // Цена ордера
         if (NormalizeDouble(MathAbs(Price-Win_Price),Digits)< //Выбор
            NormalizeDouble(Dist,Digits))       // самого близкого орд       
           {
            Dist=MathAbs(Price-Win_Price);      // Новое значение
            Real_Order=Tip;                     // Есть рыночный ордер
            int Ticket=OrderTicket();           // Номер ордера
            double Lot=OrderLots();             // Количество лотов
           }
         //------------------------------------------------------ 5 --
        }                                       //Конец анализа ордера
     }                                          //Конец перебора орд.
//--------------------------------------------------------------- 6 --
   while(true)                                  // Цикл закрытия орд.
     {
      if (Real_Order==-1)                       // Если рыночных нет
        {
         Alert("По ",Symb," рыночных ордеров нет");
         break;                                 // Выход из цикла закр        
        }
      //--------------------------------------------------------- 7 --
      switch(Real_Order)                        // По типу ордера
        {
         case 0: double Price_Cls=Bid;          // Ордер Buy
            string Text="Buy ";                 // Текст для Buy
            break;                              // Из switch
         case 1: Price_Cls=Ask;                 // Ордер Sell
            Text="Sell ";                       // Текст для Sell
        }
      Alert("Попытка закрыть ",Text," ",Ticket,". Ожидание ответа..");
      bool Ans=OrderClose(Ticket,Lot,Price_Cls,2);// Закрытие ордера
      //--------------------------------------------------------- 8 --
      if (Ans==true)                            // Получилось :)
        {
         Alert ("Закрыт ордер ",Text," ",Ticket);
         break;                                 // Выход из цикла закр
        }
      //--------------------------------------------------------- 9 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);//Другие варианты   
        }
      break;                                    // Выход из цикла закр
     }
//-------------------------------------------------------------- 10 --
   Alert ("Скрипт закончил работу -----------------------------");
   return;                                      // Выход из start()
  }

Razão: