edyuson: Как зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.
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。
是的,这并不像我想象的那么容易,现在开始出现了。而循环:lot-0.01,lot-0.01,lot-0.01,只有在乘以lot-0.02,lot-0.02,lot-0.02后,才能进一步:lot-0.04,lot-0.04,lot-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;
}
如果(OrdersTotal() == 0 && X==2)
{
if (Close[0]<dl){lot=a;}。
X=0;
}
如果(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);
//研究一些haler 可能有帮助
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为该货币对的当前汇率。
你如何理解这第一种货币对美元?
是的...紧密...:-)
基准(第一)货币对美元,在英镑 对日元的例子中,就是英镑/日元,将是英镑/美元。
我重新做了这个 脚本,这就是你所需要的,根据资金量和止损大小计算交易头寸的数量。
你也需要它--"我面临一个问题,我已经挣扎了三天,无法解决它。在完成的专家顾问中,我决定输入风险百分比,而不是手数,所以我需要计算手数来停止,例如,在10 000点的时候,1%的风险在100点的时候停止,这将是大约0.1手,在200手的时候停止,手数应该是0.05,所以1%的风险保持在同一水平。我希望一切都很清楚。 而你在这里写。
"我如何计算手数,以便使损失等于存款的10%,例如,如果价格达到止损点?我只是不善于处理数字。"
所以我修改了教程中的手数计算 功能--其描述和方法是一样的,只是不按存款规模的百分比计算手数,而是完全按你(在这个例子中由我给出--见脚本,上面的链接)的条件计算交易手数。
我试过这个方法。现在,在整个测试期间,有一个待定的 STOPLOSS订单 已经打开,就是这样......也许我的终端出现了故障?
该程序应该每天从早上7点到9点找到最高和最低价格,并在这些水平上下达止损单。
我试过这个方法。现在,在整个测试期间,有一个待定的STOPLOSS订单已经打开,就是这样......也许我的终端出现了故障?
你好。
有没有人在功能上遇到过问题?
IsDemo()
?
我总是得到一个结果--账户是真实的(无论它是真实的还是模拟的)。
你好。
有没有人在功能上遇到过问题?
?
我总是得到一个结果--我的账户是真实的(无论它是真实的还是模拟的)。
我把一个EA放在模拟账户 的图表上,上面有一个代码。
在该杂志中写道。"这是个演示。我有一个模拟账户,图表上有一个带代码的EA。
它在日志中写道。"这是个演示。我在phibogroup上有一个模拟账户--出于某种神秘的原因,它说我在一个真实账户上。在你的版本中,它显示 - 这不是一个演示。
原来,在某种程度上,DC本身是变态的
我在phibogroup上有一个演示--出于某种神秘的原因,它说我是在真实的。在你的图片版本中--这不是一个演示。
事实证明,不知何故,DC本身已经变得变态了
有些经纪公司的一台服务器同时用于模拟和真实。请向你的经纪人支持部门查询。
谢谢你。