[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 825

 
eugggy:
Eu entendo em termos gerais, mas o que significa se(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break; se nenhuma ordem desse tipo for selecionada, então abortar ou o quê?


OrderSelect (ver https://docs.mql4.com/ru/trading/OrderSelect) retorna FALSO quando a função falha. Ver https://docs.mql4.com/ru/basis/operators/break para o operador do break.

Isto pode ser simplificado para

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

o principal é selecionar a ordem.

 
eugggy:


E para mim parece absolutamente diferente. Você poderia inserir isto em seu código se(Tip===OP_BUYSTOP||Tip===OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket);

e se sim, qual parte?


Sem ver seu código, posso assumir que ao invés disso (tudo depende de seu algoritmo):

if(OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
if(OrderType()==OP_BUYLIMIT) OrderDelete(OrderTicket());
if(OrderType()==OP_SELLLIMIT) OrderDelete(OrderTicket());

Somente você precisa colocar ordem nas variáveis e corrigir parênteses em condições com ||| e &&.

A condição Minuto()<59&&Minuto()>57 pode ser reduzida para Minuto()==58 ou uso >= ou <==.

Para forçar o fechamento de uma ordem pendente no final de um período ou em um determinado momento ao defini-la, você pode especificar o parâmetro de data de expiração - ver https://docs.mql4.com/ru/trading/OrderSend. Neste caso, você não precisa se preocupar em programar seu fechamento. E a ordem será fechada incondicionalmente sem nenhuma correção por falta de conexão.

 
eugggy:

Sim, muitas coisas úteis. Eu poderia ter feito sem os freebies, mas é um livro didático muito intrincadamente escrito.
Veja... Estou a falar de como "eles estão a falar agora" :)

Freebie, meus! Yo! Vem aí o corpo de Evry!!!

Acho que se o livro didático SC fosse escrito dessa forma, seria um 6+.

Desculpe pelo fora de tópico...

 
eugggy:

Não, não precisamos dele, precisamos dele em adição. Eu olhei para o gráfico: às vezes o preço não sai do canal High-Low e as ordens pendentes permanecem. Se eles não saírem do canal Alto-Baixo, eles permanecem. A única coisa que você precisa é fechar os pendentes antes que os novos apareçam. Quanto ao livro de 1986, você está falando sério? Eu mesmo sou antigo, mas acho que é demais.


Além disso, você tem que escrever um código adicional semelhante. De alguma forma, me parece que seu código é um pouco confuso.

Eu não estava brincando com o livro de 1986. Mais uma vez, se você quer aprender as bases da programação, você precisa aprendê-las sem entupir sua cabeça com construções modernas de linguagem. Você precisa do básico. Os livros de informática para as escolas de ensino médio, especialmente o primeiro, são metodicamente bem compostos para pessoas "burras". Como, por quem, para quem e por que os livros didáticos modernos são escritos é um tema à parte

 

data hora preço dos lotes

26 2010.01.05 12:24 venda 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 compra 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 venda 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 comprar 15 0.72 1.44326 1.43445 1.44826 0.00 3200.09
34 2010.01.05 17:18 vender 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Aqui temos 5 pedidos em aberto nas direções correspondentes.

Como calcular a margem total para todos os pedidos abertos?

Par: EURODOLLAR, contrato 100.000, alavancagem 100.

 
ikatsko:

data hora preço dos lotes

26 2010.01.05 12:24 venda 12 0.10 1.44026 1.44907 1.43526 0.00 3200.09
28 2010.01.05 13:21 comprar 13 0.26 1.44326 1.43445 1.44826 0.00 3200.09
30 2010.01.05 15:34 venda 14 0.43 1.44026 1.44907 1.43526 0.00 3200.09
32 2010.01.05 16:27 comprar 15 0,72 1,44326 1,43445 1,44826 0,00 3200.09
34 2010.01.05 17:18 venda 16 1.19 1.44026 1.44907 1.43526 0.00 3200.09

Aqui estão 5 ordens em aberto nas respectivas direções.

Como calcular a margem total para todos os pedidos abertos?

Par: EUROLLAR, contrato 100000, alavancagem 100.

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

Devolve a quantidade de fundos gratuitos necessários para abrir 1 lote em uma ordem de compra, olhe bem para os outros, dependendo de suas necessidades.

Você também pode achar isto útil:

duplo AccountFreeMarginCheck ( símbolo decorda , int cmd, volume duplo )

Devolve a quantidade de fundos livres remanescentes após a abertura da posição especificada ao preço atual na conta corrente. Se não houver fundos disponíveis suficientes, será gerado o erro 134 (ERR_NOT_ENOUGH_MONEY).
 
Obrigado pela resposta rápida, mas quero calcular a margem ANTES destas posições abertas! A estratégia é uma avalanche, eu preciso saber se haverá um Stop Out depois que as posições correspondentes forem abertas? Os tamanhos de todos os lotes futuros são conhecidos com antecedência. Gostaria de saber: quantos pedidos (com lotes incrementais conhecidos de antemão) podem ser abertos?
 
ikatsko:
Obrigado pela resposta rápida, mas quero calcular a margem ANTES destas posições abertas! A estratégia é uma avalanche, eu preciso saber se haverá um Stop Out depois que as posições correspondentes forem abertas? Os tamanhos de todos os lotes futuros são conhecidos com antecedência. Eu gostaria de saber: quantos pedidos (com lotes incrementais conhecidos com antecedência) podem ser abertos?
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

double CorrectLots(double lt)
{
   double ltcorr;
   double pnt =      MarketInfo(Symbol(),MODE_POINT);
   double mspr =     MarketInfo(Symbol(),MODE_SPREAD);
   double dig =      MarketInfo(Symbol(),MODE_DIGITS);
   double MaxLot =   MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLot =   MarketInfo(Symbol(),MODE_MINLOT);
   double StpLot =   MarketInfo(Symbol(),MODE_LOTSTEP);
   double OneLot =   MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   double TradeMrg = NormalizeDouble(AccountFreeMargin()/4.0,dig);    // Свободные средства, разрешенные к торговле
   
   lt=MathAbs(lt);
   ltcorr=lt;                       // Зададим начальное значением ltcorr равным значению lt
   
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   
   double Money=ltcorr*OneLot+mspr*pnt;    // Вычисляем стоимость открываемой позы

   if (Money<TradeMrg)              // Если свободных средств больше, чем цена позиции - 
      {
         return(ltcorr);                                                            // ... возвращаем неизменённый лот
      }
   else if (Money>=TradeMrg)        // Если цена позиции равна или больше, чем есть свободных средств, то ...
      {
         ltcorr=MathAbs(MathFloor(TradeMrg/OneLot/StpLot)*StpLot);               // ... рассчитаем допустимый лот
         double MoneyCorr=ltcorr*OneLot+mspr*pnt;                      
         Print("Func CorrectLots: лот ",lt," скорректирован до ",ltcorr,
               " Стоимость позы до корректировки = ",Money,
               " Стоимость позы после корректировки = ",MoneyCorr
               ); 
         return(ltcorr);                                                         // ... и вернём его значение
      }
   Print("Func CorrectLots: лот вернули без изменений");
   if (lt>MaxLot) ltcorr=MaxLot;   // Проверим превышение допустимых ...
   if (lt<MinLot) ltcorr=MinLot;   // ... значений лота
   return(ltcorr);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

Tente e veja o que você pode descobrir por si mesmo... :)

E, novamente.

duplo AccountFreeMarginCheck ( símbolo decorda , int cmd, volume duplo )

Usei esta função em uma EA personalizada que também usa um martingale nú.
Eu tinha que escrever uma linha antes de abrir qualquer posição para torná-la mais estável:

double lt;                           // Лот
// --------------------------------- +

lt=CorrectLots(lt*2);                // Умножаем лот на 2 с проверкой и коррекцией под допустимый размер лота

// ------- Открытие позы ----------- +
 
Artem, eu mesmo preciso calcular a margem, ou seja, preciso conhecer a fórmula de cálculo. Eu não preciso da resposta do terminal sobre as possibilidades atuais. Eu conheço a fórmula, mas há algo sobre o cálculo da margem em posições sobrepostas! E eu nem sei o que são posições sobrepostas! Eu dei especificamente um exemplo onde você pode ver que cada posição sucessiva é aberta na direção oposta à anterior. Se você calcular a margem nas posições abertas somando todos os lotes (e colar essa quantidade na fórmula), ela não corresponde à reação real do CD quando aplica um Stop Out. Eu gostaria de calculá-lo da forma como o CD o calcula
 
ikatsko:
Artem, eu mesmo preciso calcular a margem, ou seja, preciso conhecer a fórmula de cálculo. Eu não preciso da resposta do terminal sobre as possibilidades atuais. Eu conheço a fórmula de cálculo, mas há algum tipo de peculiaridade de cálculo de margem para posições sobrepostas!!! E eu nem sei o que são posições sobrepostas! Eu dei especificamente um exemplo onde você pode ver que cada posição sucessiva é aberta na direção oposta à anterior. Se você calcular a margem nas posições abertas somando todos os lotes (e colar essa quantidade na fórmula), ela não corresponde à reação real do CD quando aplica um Stop Out. Gostaria de calculá-lo da forma como o CD o calcula

As posições sobrepostas não são iguais às posições bloqueadas? Esta é a margem necessária para manter duas posições abertas de volume igual, mas em direção oposta. Normalmente é metade da margem necessária para manter uma posição aberta do mesmo tamanho de uma das duas posições fechadas.

Notei logo, mas não achei que isso confundiria você.

Para a mesma EA calculei a margem desta forma, não sei agora, talvez seja errado???? :

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
bool LastFreeMargin(string sy, int op, double lot)
{
   if (sy=="0" || sy=="") sy=Symbol();
   double FreeEqu  = AccountFreeMargin();                         // Вся маржа
   double FreeEqu4 = NormalizeDouble(Equ_Start/4.0, 2);           // Делим маржу на 4 (Средства для торговли)
   double CheckEqu = AccountFreeMarginCheck(sy, op, lot);         // Остаток всех средств после открытия позы 
   double EquTrade = FreeEqu-CheckEqu;                            // Средства, требуемые для открытия следующей
   
   if (FreeEqu4-EquTrade>0) return(true);
   else return(false);
}   

Isto é tudo que o CD retorna para você:

MODE_MARGININIT 29 Exigência de margem inicial para 1 lote
MODE_MARGINMAINTENANCE 30 Quantidade de margem necessária para suportar posições em aberto por 1 lote
MODE_MARGINHEDGED 31 Margem cobrada em posições sobrepostas por 1 lote
MODE_MARGINREQUIRED 32 Quantidade de fundos gratuitos necessários para abrir 1 lote para comprar
Razão: