[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 509

 

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

sergeev:

сделать int счетчик и при каждом открытии прибавлять +1.

после набора нужного значения счетчика разрешить уже и lot*koef делать.


Да, не так просто оказывается, как я думал, сейчас начинает доходить. И цикл: лот-0,01, лот-0,01, лот-0,01 и только после умножать лот-0,02, лот-0,02, лот-0,02 далее: лот-0,04, лот-0,04, лот-0,04 .... должен прерываться профитом, а продолжаться лосями. Были варианты от ребят на другом форуме примерно такие: Можно объявить double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1 . 0, 1.0, 2.0 .......} - как массив, заполнив его нужными коэффициентами, и статическую или глобальную переменную int k=0;
Тогда lot=lot*koef[k++]; Начало серии: k=0;

и такие:
int k = 1;
int koef = 3;
if (k/koef == k) { lot*=2; k++; } но все не то.

Пробовал счетчик типа: int j;
for(j=0; j<15; j++)
, но опять не то. Да вот он весь:
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);
//Сюды каку то халеру надо может поможете
lot=lot*koef;

X=2;
}
}
return(0);
//Сейчас это просто мартин

 

Спасибо, а вот смотрите, есть две цены, одна - цена открытия ордера, а другая цена стоп лосса, известно количество пунктов до стоплосса и цена пункта. А как рассчитать размер лота чтобы убыток был равен к примеру 10% от депозита если цена дойдет до стоп лосса? У меня просто с цифрами совсем туго.

И еще вот не понял

Для кросс-курсов стоимость пункта, выраженная в долларах, рассчитывается по формуле
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
где LOT_SIZE — размер лота, TICK_SIZE — размер тика, BASE_QUOTE — текущая котировка базовой (первой) валюты к доллару США, CURRENT_QUOTE — текущая котировка пары.

Как это понять первой валюты к доллару США?

 

Да... туго... :-)

базовой (первой) валюты к доллару США, - это, в примере GBP к JPY - GBP/JPY, будет GBP/USD

Я переделал этот скрипт, который Вам и нужен с расчетом торгуемого объема позы в сделке в зависимости от величины капитала и размера стоп-лосса.

Вам же это нужно - "Столкнулся с проблемой и вот уже третий день бьюсь и решить не могу. В готовом советнике решил вместо лота ввести % риска, поэтому нужен расчёт лота к стопу, например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1 а вот при стопе 200 лот уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровне. Надеюсь всё понятно изложил." и вот Вы пИшете:

"А как рассчитать размер лота чтобы убыток был равен к примеру 10% от депозита если цена дойдет до стоп лосса? У меня просто с цифрами совсем туго."

В общем я переделал ф-ию расчета лота из учебника - описание и подход к ней тот же, только вместо расчета лота по проценту от величины депа, торгуемый лот расчитывается именно по Вашим (приведенным мной в этом примере - см. скрипт по ссылке выше) условиям:

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;



Я попробовал данный способ. Теперь за весь период тестирования открылся один отложенный ордер STOPLOSS. и все...может у меня терминал глючит?

По идее программа должна находить максимум и минимум цены каждый день, с 7 до 9 утра и ставить на эти уровни стоп ордера.

Файлы:
 
mamba5:


Я попробовал данный способ. Теперь за весь период тестирования открылся один отложенный ордер STOPLOSS. и все...может у меня терминал глючит?

А в журнал вломы посмотреть на предмет, что конкретно глючит?
 

Здравствуйте.

Были ли у кого-нибудь проблемы с функцией

IsDemo()

?

Она у меня постоянно выдаёт 1 результат - что счёт реальный (вне зависимости от того реальный он или демо).

 
nemo811:

Здравствуйте.

Были ли у кого-нибудь проблемы с функцией

?

Она у меня постоянно выдаёт 1 результат - что счёт реальный (вне зависимости от того реальный он или демо).

Воткнул на чарт советник с кодом на демо счете:

int start()
  {
//----
   if (IsDemo()) {
      Print("Это демо");
      return(0);
   }
   Print("Это не демо");
   
//----
   return(0);
}
Пишет в журнале: "Это демо".
 
Reshetov:

Воткнул на чарт советник с кодом на демо счете:

Пишет в журнале: "Это демо".

У меня демка на фибогрупп - по загадочной причине пишет что я на реале. В Вашем варианте изобразила - Это не демо.

Получается, что как-то извратилось само ДЦ

 
nemo811:

У меня демка на фибогрупп - по загадочной причине пишет что я на реале. В Вашем варианте изобразила - Это не демо.

Получается, что как-то извратилось само ДЦ

У некоторых брокеров выделяют один сервер и для демо и для реала. Уточняйте в саппорте брокера.
 
Reshetov:
У некоторых брокеров выделяют один сервер и для демо и для реала. Уточняйте в саппорте брокера.

Спасибо.