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); }
Спасибо, а вот смотрите, есть две цены, одна - цена открытия ордера, а другая цена стоп лосса, известно количество пунктов до стоплосса и цена пункта. А как рассчитать размер лота чтобы убыток был равен к примеру 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% от депозита если цена дойдет до стоп лосса? У меня просто с цифрами совсем туго."
В общем я переделал ф-ию расчета лота из учебника - описание и подход к ней тот же, только вместо расчета лота по проценту от величины депа, торгуемый лот расчитывается именно по Вашим (приведенным мной в этом примере - см. скрипт по ссылке выше) условиям:
externstring A0 = "Параметры ММ и мониторинга";
externdouble Lots = 0; // Стартовый лот = 0 для использования максимального риска на капитал в процентах, в зависимости от величины стоп-лоссаexternint StopLoss = 1000;
externint TakeProfit =4000; // TakeProfit для новых ордеров (пунктов)externdouble 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 --
edyuson:
sergeev:Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.
сделать 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% от депозита если цена дойдет до стоп лосса? У меня просто с цифрами совсем туго."
В общем я переделал ф-ию расчета лота из учебника - описание и подход к ней тот же, только вместо расчета лота по проценту от величины депа, торгуемый лот расчитывается именно по Вашим (приведенным мной в этом примере - см. скрипт по ссылке выше) условиям:
Я попробовал данный способ. Теперь за весь период тестирования открылся один отложенный ордер STOPLOSS. и все...может у меня терминал глючит?
По идее программа должна находить максимум и минимум цены каждый день, с 7 до 9 утра и ставить на эти уровни стоп ордера.
Я попробовал данный способ. Теперь за весь период тестирования открылся один отложенный ордер STOPLOSS. и все...может у меня терминал глючит?
Здравствуйте.
Были ли у кого-нибудь проблемы с функцией
IsDemo()?
Она у меня постоянно выдаёт 1 результат - что счёт реальный (вне зависимости от того реальный он или демо).
Здравствуйте.
Были ли у кого-нибудь проблемы с функцией
?
Она у меня постоянно выдаёт 1 результат - что счёт реальный (вне зависимости от того реальный он или демо).
Воткнул на чарт советник с кодом на демо счете:
Пишет в журнале: "Это демо".Воткнул на чарт советник с кодом на демо счете:
Пишет в журнале: "Это демо".У меня демка на фибогрупп - по загадочной причине пишет что я на реале. В Вашем варианте изобразила - Это не демо.
Получается, что как-то извратилось само ДЦ
У меня демка на фибогрупп - по загадочной причине пишет что я на реале. В Вашем варианте изобразила - Это не демо.
Получается, что как-то извратилось само ДЦ
У некоторых брокеров выделяют один сервер и для демо и для реала. Уточняйте в саппорте брокера.
Спасибо.