[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 509

 

edyuson:
Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.

sergeev:

fare un contatore int e aggiungere +1 ad ogni apertura.

Una volta impostato il valore corretto del contatore, permettete di fare anche il lot*koef.


Sì, non è così facile come pensavo, ora comincia a verificarsi. E il ciclo: lotto-0.01, lotto-0.01, lotto-0.01 e solo dopo aver moltiplicato lotto-0.02, lotto-0.02, lotto-0.02 ulteriormente: lotto-0.04, lotto-0.04, lotto-0.04 .... dovrebbe essere interrotto dal profitto e continuare con i lotti. Ci sono state alcune varianti dai ragazzi dell'altro forum su questo: Potreste dichiarare double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 . 0, 1.0, 2.0 .......} - come un array, riempiendolo con i coefficienti richiesti, e una variabile statica o globale int k=0;
Allora lot=lot*koef[k++]; Serie iniziale: k=0;

e così:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } ma tutto è sbagliato.

Ho provato un contatore come: int j;
for(j=0; j<15; j++)
, ma di nuovo non è lo stesso. Ecco tutto:
int X=0;
double S = 0.0000;
extern double lot=0.01;
extern double koef=2.0;
extern int SL=30;
extern int TP=120;
double dl;
double a;
int init()
{
a=lot;
return(0);
}
int deinit()
{
return(0);
}

int start()

{
if(OrdersTotal() == 0 && X==1)
{
if (Close[0]>dl){lot=a;}
X=0;
}

if(OrdersTotal() == 0 && X==2)
{
if (Close[0]<dl){lot=a;}
X=0;
}


se (OrdersTotal() == 0 && Close[1]>Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-SL*0.0001,Ask+TP*0.0001,",14774,0,Blue);
//--------------------------------------------------------------------

lot=lot*koef;
X=1;
}

if(OrdersTotal() == 0 && Close[1]<Open[1])
{
dl=Close[0];
OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+SL*0.0001,Bid-TP*0.0001,",14774,0,Red);
//suddividere qualche haler può aiutare
lot=lot*koef;

X=2;
}
}
return(0);
//È solo un martin

 

Grazie, ma guarda, ci sono due prezzi, uno è il prezzo di apertura dell'ordine, e l'altro è il prezzo di stop loss, il numero di punti allo stop loss e il prezzo del punto sono noti. Come posso calcolare la dimensione del lotto in modo che la perdita sia il 10% del deposito se il prezzo raggiunge lo stop loss? Non sono bravo con le cifre.

Inoltre non capisco

Per i tassi di cross, il valore del punto, espresso in dollari, è calcolato dalla formula
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
dove LOT_SIZE è la dimensione del lotto, TICK_SIZE è la dimensione del tick, BASE_QUOTE è la quotazione attuale della valuta di base (prima) in dollari USA, CURRENT_QUOTE è il tasso attuale della coppia.

Come si capisce questa prima moneta al dollaro americano?

 

Sì... stretto... :-)

la valuta di base (prima) al dollaro USA, è, nell'esempio GBP a JPY - GBP/JPY, sarebbeGBP/USD

Ho rifatto questo script, che è quello che ti serve con il calcolo del volume della posizione scambiata, a seconda della quantità di capitale e della dimensione dello stop loss.

Anche voi ne avete bisogno - "Ho affrontato un problema e sto lottando già da tre giorni e non riesco a risolverlo. Nell'Expert Advisor finito ho deciso invece di un lotto di inserire la % di rischio, quindi ho bisogno di calcolare il lotto da fermare, per esempio a 10 000 depo il rischio dell'1% ad uno stop di 100 punti sarà circa 0,1 lotto e qui a 200 lot stop il lotto dovrebbe essere 0,05, quindi l'1% di rischio è rimasto allo stesso livello. Spero che tutto sia chiaro, ed eccoti qui a scrivere:

"Come posso calcolare la dimensione del lotto in modo che la perdita sia uguale al 10% del deposito, per esempio, se il prezzo raggiunge lo stop loss? Non sono bravo con i numeri ".

Così ho modificato la funzione di calcolo del lotto dal tutorial - la sua descrizione e l'approccio sono gli stessi, solo che invece di calcolare il lotto in base alla percentuale della dimensione del deposito, il lotto negoziato viene calcolato in base alle tue condizioni (date da me in questo esempio - vedi script sopra):

extern string A0 = "Параметры ММ и мониторинга";
extern double Lots = 0;           // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лосса
extern int StopLoss = 1000;
extern int TakeProfit =4000;      // TakeProfit для новых ордеров (пунктов)
extern  double MaxRisk = 10;      // риск на капитал в %
                                  // рассчитываем объем позиции взависимости от размера стопа, при заданном риске
                                  // например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,
                                  // при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне

int start()
{    
   //----------------------------------СТАРТ------------------------------------------------------------------------------------- 
 
// ...  

//----------------------------------Расчет объема лота------------------------------------------------------------------------ 
  if (Lot(StopLoss)==false)  
                        {
                          Comment(" Пополните счет. Не хватает средств на минимальный лот. Советник остановлен.");// Если средств не хватает на мин, то выход
                          Print  ("Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin()); 
                                                                                                   // Если средств не хватает на мин, то выход
                          return (0);
                        }  
// ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...                          
   Lots_New = NormalizeLots(Lots_New);      

//... здесь условия на открытие поз и установка ордеров

}//------------------------------------------Конец Старт-----------------------------------------------------

//+------------------------------------------------------------------+
//| Нормализация лота                                                |
//+------------------------------------------------------------------+

double NormalizeLots(double lot)
{
   double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   double lots = NormalizeDouble(lot / lotStep, 0) * lotStep;   
   lots = MathMax(lots, MarketInfo(Symbol(), MODE_MINLOT));
   lots = MathMin(lots, MarketInfo(Symbol(), MODE_MAXLOT));   
   return (lots);
}

//--------------------------------------------------------------------
// Lot.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления количества лотов.
// Глобальные переменные:
// double Lots_New - количество лотов для новых ордеров (вычисляется)
// double Lots     - желаемое количество лотов, заданное пользовател.
// double  MaksRisk  - процент риска
// Возвращаемые значения:
// true  - если средств хватает на минимальный лот
// false - если средств не хватает на минимальный лот
//--------------------------------------------------------------- 2 --
bool Lot(int sl)                               // Позовательская ф-ия
  {
   string Symb   =Symbol();                    // Финансовый инструм.
   double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим. 1 лота
   double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. размер. лотов
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен размера
   double Free   =AccountFreeMargin();         // Свободные средства
   double LotVal =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта для 1 лота
   

//--------------------------------------------------------------- 3 --
   if (Lots > 0)                                 // Лоты заданы явно..
     {                                         // ..проверим это
      double Money=Lots*One_Lot;               // Стоимость ордера
      if(Money<=AccountFreeMargin())           // Средств хватает..
         Lots_New=Lots;                        // ..принимаем заданное
      else                                     // Если не хватает..
         Lots_New=MathFloor(Free/One_Lot/Step)*Step;// Расчёт лотов
     }
//--------------------------------------------------------------- 4 --
  else                                        // Если лоты не заданы
     {                                         // то берём процент 
                                               // Желаем. колич.лотов:
                                               
      Lots_New =MathFloor((Free*MaxRisk/100)/(sl*LotVal)/Step)*Step;
      if(Lots_New<Min_Lot) Lots_New=Min_Lot;
      if(Lots_New>Max_Lot) Lots_New=Max_Lot;
      Print ("Lot_New в ф-ии Lots = ",Lots_New, "ширина канала = ",sl, "Point  = ",Point);
     }
//--------------------------------------------------------------- 5 --
   if (Lots_New < Min_Lot)                     // Если меньше допуст..
      Lots_New=Min_Lot;                        // .. то миниамальный
   if (Lots_New*One_Lot > AccountFreeMargin()) // Не хватает даже..
     {                                         // ..на минимальн. лот:(
      Print ("Не хватает средств на минимальный лот.  Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin());  // Сообщение..
      return(false);                           // ..и выход 
     }
   return(true);                               // Выход из польз. ф-ии
  }
//--------------------------------------------------------------- 6 --
 
Reshetov:
static int Kvadrat = 0;



Ho provato questo metodo. Ora, durante tutto il periodo di prova, si è aperto un ordine in sospeso STOPLOSS e questo è tutto... forse il mio terminale è difettoso?

Il programma dovrebbe trovare i prezzi massimi e minimi ogni giorno, dalle 7 alle 9 del mattino e mettere un ordine di stop a questi livelli.

File:
 
mamba5:


Ho provato questo metodo. Ora, durante tutto il periodo di test, si è aperto un ordine STOPLOSS in sospeso e questo è tutto... forse il mio terminale è difettoso?

Hai problemi a guardare nel log per vedere esattamente cosa è il glitch?
 

Salve.

Qualcuno ha avuto problemi con la funzione

IsDemo()

?

Ottengo sempre 1 risultato - che il conto è reale (non importa se è reale o demo).

 
nemo811:

Salve.

Qualcuno ha avuto problemi con la funzione

?

Ottengo sempre 1 risultato - il mio conto è reale (non importa se è reale o demo).

Ho messo un EA su un grafico con un codice su un conto demo:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Scrive nella rivista: "Questa è una dimostrazione.
 
Reshetov:

Ho un conto demo con un EA con codice sul grafico:

Scrive nel registro: "Questa è una dimostrazione.

Ho una demo su un phibogroup - per qualche ragione misteriosa dice che sono su un conto reale. Nella tua versione mostra - Questo non è un demo.

Si scopre che in qualche modo il DC stesso è pervertito

 
nemo811:

Ho una demo su phibogroup - per qualche ragione misteriosa dice che sono su real. Nella tua versione dell'immagine - Non è una demo.

Si scopre che in qualche modo la stessa DC è diventata perversa

Alcuni broker forniscono un server sia per la demo che per quella reale. Controlla con il supporto del broker.
 
Reshetov:
Alcuni broker hanno un server sia per la demo che per quella reale. Controlla con il dipartimento di supporto del tuo broker.

Grazie.

Motivazione: