[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 509

 

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

sergeev:

einen int-Zähler erstellen und bei jeder Öffnung +1 hinzufügen.

Sobald der richtige Zählerwert eingestellt ist, können Sie auch Lot*koef durchführen.


Ja, es ist nicht so einfach, wie ich dachte, aber jetzt fängt es an. Und der Zyklus: Los-0.01, Los-0.01, Los-0.01 und erst nach Multiplikation von Los-0.02, Los-0.02, Los-0.02 weiter: Los-0.04, Los-0.04, Los-0.04 .... sollte durch den Gewinn unterbrochen werden und mit Losen fortgesetzt werden. Es gab einige Varianten von den Jungs im anderen Forum zu diesem Thema: Man könnte double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 . 0, 1.0, 2.0 .......} - als Array, das mit den gewünschten Koeffizienten und einer statischen oder globalen Variablen gefüllt wird int k=0;
Then lot=lot*koef[k++]; Starting series: k=0;

und so:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } aber das ist nicht alles dasselbe.

Ich habe es mit einem Zähler versucht wie: int j;
for(j=0; j<15; j++)
, aber auch hier ist es nicht dasselbe. Hier ist alles:
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;
}


if (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);
//sudy some haler may help
lot=lot*koef;

X=2;
}
}
return(0);
//Es ist nur eine Schwalbe

 

Danke, aber sehen Sie, es gibt zwei Preise, einer ist der Eröffnungskurs des Auftrags und der andere ist der Stop-Loss-Preis, die Anzahl der Punkte bis zum Stop-Loss und der Preis des Punktes sind bekannt. Wie berechne ich die Losgröße so, dass der Verlust 10 % der Einlage beträgt, wenn der Kurs den Stop Loss erreicht? Ich bin einfach nicht gut mit Zahlen.

Ich verstehe auch nicht

Bei Kreuzkursen wird der in Dollar ausgedrückte Punktwert nach der Formel
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
berechnet, wobei LOT_SIZE die Lotgröße, TICK_SIZE die Tickgröße, BASE_QUOTE die aktuelle Notierung der Basiswährung (erste Währung) in US-Dollar und CURRENT_QUOTE der aktuelle Kurs des Paares ist.

Wie ist diese erste Währung zum US-Dollar zu verstehen?

 

Ja... eng... :-)

die Basiswährung (erste Währung) zum US-Dollar, d. h. im Beispiel GBP zu JPY - GBP/JPY, wäreGBP/USD

Ich habe dieses Skript überarbeitet, das die Berechnung des Volumens der gehandelten Positionen in Abhängigkeit von der Höhe des Kapitals und der Stop-Loss-Größe enthält.

Das brauchen Sie auch - "Ich habe ein Problem und kämpfe schon seit drei Tagen und kann es nicht lösen. Im fertigen Expert Advisor habe ich mich entschlossen, statt eines Lots das %-Risiko einzugeben, also muss ich das Lot zum Stop berechnen, z.B. bei 10 000 Depot das Risiko von 1% bei einem Stop von 100 Punkten wird es etwa 0,1 Lot sein und hier bei 200 Lot Stop sollte das Lot 0,05 sein, also ist das 1%-Risiko auf dem gleichen Niveau geblieben. Ich hoffe, es ist alles klar, und Sie schreiben hier:

"Wie berechne ich die Losgröße so, dass der Verlust z.B. 10% der Einlage beträgt, wenn der Kurs einen Stop-Loss erreicht? Ich kann einfach nicht gut mit Zahlen umgehen. "

Also habe ich die Lot-Berechnungsfunktion aus dem Tutorial modifiziert - die Beschreibung und der Ansatz ist derselbe, nur dass anstelle der Lot-Berechnung nach Prozentsatz der Depotgröße das gehandelte Lot genau nach Ihren (von mir in diesem Beispiel angegebenen - siehe Skript, Link oben) Bedingungen berechnet wird:

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;



Ich habe diese Methode ausprobiert. Während des gesamten Testzeitraums hat sich eine ausstehende STOPLOSS-Order geöffnet, und das war's... vielleicht hat mein Terminal eine Störung?

Das Programm soll jeden Tag zwischen 7 und 9 Uhr Höchst- und Tiefstkurse ermitteln und bei diesen Kursen einen Stoppauftrag erteilen.

Dateien:
 
mamba5:


Ich habe diese Methode ausprobiert. Während des gesamten Testzeitraums wurde eine ausstehende STOPLOSS-Order geöffnet, und das war's... vielleicht ist mein Terminal defekt?

Haben Sie Probleme, im Protokoll zu sehen, was genau die Störung ist?
 

Hallo.

Hatte jemand Probleme mit der Funktion

IsDemo()

?

Ich erhalte immer 1 Ergebnis - dass das Konto echt ist (egal ob es sich um ein echtes oder ein Demokonto handelt).

 
nemo811:

Hallo.

Hatte jemand Probleme mit der Funktion

?

Ich erhalte immer 1 Ergebnis - mein Konto ist echt (egal ob es echt oder Demo ist).

Ich habe einen EA auf einem Diagramm mit einem Code auf einem Demokonto platziert:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Schreibt in der Zeitschrift: "Dies ist eine Demo.
 
Reshetov:

Ich habe ein Demokonto mit einem EA mit Code auf dem Chart:

Er schreibt in das Protokoll: "Dies ist eine Demo.

Ich habe eine Demo auf einer Phibogruppe - aus irgendeinem mysteriösen Grund sagt sie, ich sei auf einem echten Konto. In Ihrer Version heißt es - Dies ist keine Demo.

Es stellt sich heraus, dass die DC selbst irgendwie pervertiert ist

 
nemo811:

Ich habe eine Demo auf phibogroup - aus irgendeinem mysteriösen Grund sagt sie, ich sei auf real. In Ihrer Version des Bildes - Es ist keine Demo.

Es stellt sich heraus, dass die DC selbst irgendwie pervers geworden ist

Einige Broker stellen einen Server sowohl für die Demo- als auch für die Echtgeldversion zur Verfügung. Wenden Sie sich an den Support des Brokers.
 
Reshetov:
Einige Broker haben einen Server für Demo- und Echtgeldgeschäfte. Wenden Sie sich an die Support-Abteilung Ihres Brokers.

Ich danke Ihnen.