[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 825

 
eugggy:
Capisco in termini generali, ma cosa significa if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))break; se nessun ordine è selezionato, allora abortisci o cosa?


OrderSelect (vedi https://docs.mql4.com/ru/trading/OrderSelect) restituisce FALSE quando la funzione fallisce. Vedere https://docs.mql4.com/ru/basis/operators/break per l'operatore della pausa.

Questo può essere semplificato a

OrderSelect(i,SELECT_BY_POS,MODE_TRADES);

la cosa principale è selezionare l'ordine.

 
eugggy:


E a me sembrano cose assolutamente diverse. Potresti inserire questo nel tuo codice if(Tip==OP_BUYSTOP||Tip==OP_SELLSTOP&&Minute()<59&&Minute()>57) OrderDelete(Ticket);

e se sì, quale parte?


Senza vedere il tuo codice, posso supporre che invece (tutto dipende dal tuo 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());

Bisogna solo mettere ordine nelle variabili e correggere le parentesi nelle condizioni con || e &&.

La condizione Minute()<59&&Minute()>57 può essere ridotta a Minute()==58 o usare >= o <=.

Per forzare la chiusura di un ordine pendente alla fine di un periodo o a una certa ora quando lo si imposta, si può specificare il parametro della data di scadenza - vedi https://docs.mql4.com/ru/trading/OrderSend. In questo caso non c'è bisogno di preoccuparsi di programmare la sua chiusura. E l'ordine sarà chiuso incondizionatamente senza alcuna correzione per la mancanza di connessione.

 
eugggy:

Sì, molte cose utili. Avrei potuto fare a meno degli omaggi, ma è un libro di testo molto intricato.
Vedete... Sono a proposito di come "stanno parlando ora" :)

Freebie, ragazzi! Yo! Avanti a tutti i corpi!!!

Credo che se il libro di testo di SC fosse scritto così, sarebbe un 6+.

Scusate l'off-topic...

 
eugggy:

No, non ci serve invece, ci serve in aggiunta. Ho guardato il grafico: a volte il prezzo non esce dal canale High-Low e gli ordini pendenti rimangono. Se hai una data di scadenza, puoi risolverla, sono d'accordo. Per quanto riguarda il libro del 1986, sei serio? Io stesso sono antico, ma penso che sia troppo.


Inoltre, dovete scrivere ulteriore codice simile. In qualche modo mi sembra che il tuo codice sia un po' confuso.

Non stavo scherzando sul libro del 1986. Di nuovo, se volete imparare le basi della programmazione, dovete impararle senza intasarvi la testa con i costrutti del linguaggio moderno. Avete bisogno delle basi. I libri di testo di informatica per le scuole superiori, specialmente il primo, sono metodicamente ben composti per persone "stupide". Come, da chi, per chi e perché vengono scritti i libri di testo moderni è un argomento a parte

 

data ora lotti prezzo

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

Qui abbiamo 5 ordini aperti nelle direzioni corrispondenti.

Come calcolare il margine totale per tutti gli ordini aperti?

Coppia: EURUSD, contratto 100.000, leva 100.

 
ikatsko:

data ora lotti prezzo

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

Qui ci sono 5 ordini aperti nelle rispettive direzioni.

Come faccio a calcolare il margine totale per tutti gli ordini aperti?

Coppia: EUROLLAR, contratto 100000, leva 100.

MarketInfo(Symbol(),MODE_MARGINREQUIRED);

Restituisce la quantità di fondi liberi necessari per aprire 1 lotto in un ordine di acquisto, bene guardare gli altri, a seconda delle vostre esigenze.

Potresti anche trovare questo utile:

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

Restituisce la quantità di fondi liberi rimanenti dopo aver aperto la posizione specificata al prezzo corrente sul conto corrente. Se non ci sono abbastanza fondi disponibili, verrà generato l'errore 134 (ERR_NOT_ENOUGH_MONEY).
 
Grazie per la risposta rapida, ma voglio calcolare il margine PRIMA che queste posizioni si aprano! La strategia è una valanga, ho bisogno di sapere se ci sarà uno Stop Out dopo l'apertura delle posizioni corrispondenti? Le dimensioni di tutti i prossimi lotti sono note in anticipo. Vorrei sapere: quanti ordini (con lotti incrementali conosciuti in anticipo) possono essere aperti?
 
ikatsko:
Grazie per la risposta rapida, ma voglio calcolare il margine PRIMA che queste posizioni si aprano! La strategia è una valanga, ho bisogno di sapere se ci sarà uno Stop Out dopo l'apertura delle posizioni corrispondenti? Le dimensioni di tutti i prossimi lotti sono note in anticipo. Vorrei sapere: quanti ordini (con lotti incrementali noti in anticipo) possono essere aperti?
// ==========================================================================
// ------------ Функция рассчёта величины лота для открытия позиции ---------
// Если лот превышает возможный для открытия позы, то он корректируется 
// ==========================================================================

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);                            // Возврат изначального лота в непредусмотренных случаях с сообщением
}

Prova a vedere cosa puoi scoprire da solo... :)

E, di nuovo.

double AccountFreeMarginCheck ( string symbol, int cmd, double volume)

Ho usato questa funzione in un EA personalizzato che usa anche una martingala nuda.
Ho dovuto scrivere una riga prima di aprire qualsiasi posizione per renderla più stabile:

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

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

// ------- Открытие позы ----------- +
 
Artem, ho bisogno di calcolare il margine da solo, cioè ho bisogno di conoscere la formula di calcolo. Non ho bisogno della risposta del terminale sulle possibilità attuali. Conosco la formula, ma c'è qualcosa sul calcolo del margine su posizioni sovrapposte! E non so nemmeno cosa siano le posizioni sovrapposte! Ho specificamente dato un esempio in cui si può vedere che ogni posizione successiva è aperta nella direzione opposta a quella precedente. Se calcolate il margine sulle posizioni aperte sommando tutti i lotti (e incollate quell'importo nella formula), non corrisponde alla reazione reale del DC quando applica uno Stop Out. Vorrei calcolarlo come lo calcola il DC
 
ikatsko:
Artem, ho bisogno di calcolare il margine da solo, cioè ho bisogno di conoscere la formula di calcolo. Non ho bisogno della risposta del terminale sulle possibilità attuali. Conosco la formula di calcolo, ma c'è una specie di particolarità del calcolo del margine per le posizioni sovrapposte!!! E non so nemmeno cosa siano le posizioni sovrapposte! Ho specificamente dato un esempio in cui si può vedere che ogni posizione successiva è aperta nella direzione opposta a quella precedente. Se calcolate il margine sulle posizioni aperte sommando tutti i lotti (e incollate quell'importo nella formula), non corrisponde alla reazione reale del DC quando applica uno Stop Out. Vorrei calcolarlo come lo calcola il DC

Le posizioni sovrapposte non sono uguali a quelle bloccate? Questo è il margine richiesto per mantenere due posizioni aperte di uguale volume ma di direzione opposta. Di solito è la metà del margine richiesto per mantenere una posizione aperta dello stesso volume di una delle due posizioni bloccate.

L'ho notato subito, ma non pensavo che ti avrebbe confuso...

Per lo stesso EA ho calcolato il margine in questo modo, ora non so, forse è sbagliato? :

// ======================================================================
// -------------------------- Рассчёт свободной маржи -------------------
// ======================================================================
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);
}   

Questo è tutto ciò che il DC vi restituisce:

MODALITÀ_MARGININIT 29 Margine iniziale richiesto per 1 lotto
MODALITÀ_MARGINE-MANUTENZIONE 30 Importo del requisito di margine per sostenere le posizioni aperte per 1 lotto
MODO_MARGINE COPERTO 31 Margine addebitato su posizioni sovrapposte per 1 lotto
MODO_MARGINE RICHIESTO 32 Quantità di fondi liberi necessari per aprire 1 lotto per comprare
Motivazione: