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:
セルゲイКак зделать, чтоб не сразу умножал, а скажем через два-три раза? Пример: лот=0,01, еще - 0,01, еще - 0,01 и только после умножать. Подскажите, если не много возни. Спасибо.
intカウンターを作成し、開くたびに+1する。
正しいカウンタ値が設定されたら、ロット*コエフもできるようにします。
そう、思ったほど簡単なことではないのです、今、それが起こり始めているのです。そして、ロット-0.01、ロット-0.01、ロット-0.01と、ロット-0.02、ロット-0.02、さらにロット-0.02を掛けた後にのみ、ロット-0.04、ロット-0.04・・・、というサイクルになります。は利益で中断し、ロットで継続する必要があります。これについては、他の掲示板の人たちから変種が出たんですよ。double koef[]={ 1.0, 2.0, 1.0, 1.0, 1.0, 2.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);
//sudy some haler may help
lot=lot*koef;
X=2;
} } } } { {dl=Close[0]; {dl=Close[0]; } {size=2] {dl=Close[0]; {dl=Lot*koef; {dl=Lot*koef
}
return(0);
//ただのマーチンです。
ありがとうございます、でも見てください、二つの価格があります、一つは注文の開始価格、もう一つはストップロスの価格です、ストップロスまでのポイント数とポイントの価格は分かっているのです。価格がストップロスに達した場合の損失が入金額の10%になるように、ロットサイズを計算するにはどうすればよいですか?ただ、私は数字が苦手なんです。
また、私は理解できません。
クロス・レートの場合、ドルで表示されるポイント値は、
PIP = LOT_SIZE * TICK_SIZE * BASE_QUOTE / CURRENT_QUOTE,
ここで LOT_SIZE はロットサイズ、TICK_SIZE はティックサイズ、BASE_QUOTE は基準(第一)通貨の米ドルに対する現在の相場、 CURRENT_QUOTE は現在のペアレートとなります。
この最初の通貨を米ドルにすることをどのように理解していますか?
そうですね...っ:-)
米ドルに対する基本(最初の)通貨は、例ではGBP to JPY - GBP/JPYで、GBP/USDと なります。
この スクリプトは、資金量と損切りサイズに応じて取引されたポジション量を計算するもので、必要なものを作り直しました。
あなたも必要です。「ある問題に直面し、すでに3日間も格闘しているが解決できない。完成したExpert Advisorでは、私はリスクの%を入力するロットの代わりに決定したので、私は、例えば10 000デポで100ポイントの停止で1%のリスクは、それが約0.1ロットになり、ここで200ロット停止でロットは0.05でなければならない、だから1%のリスクは同じレベルにとどまっています停止するには、多くの計算する必要があります。すべてクリアしていることを祈ります。 そして、ここに書いていますね。
"例えば価格がストップロスに達した場合、損失が入金額の10%になるようにロットサイズを計算 するにはどうすればよいですか?数字が 苦手なんです。"
チュートリアルのロット計算 機能を修正しました。その説明と方法は同じですが、入金額の割合でロットを計算する代わりに、取引ロットはあなたの(この例では私が与えた - 上のリンクのスクリプトを参照)条件によって正確に計算されます。
この方法を試してみました。今、テスト期間中、保留中の STOPLOSS注文が 1つオープンして、それだけです。私の端末が不具合なのかも?
このプログラムは、毎日午前7時から9時の間に最高値と最低値を見つけ、その水準でストップオーダーを出すことになっています。
この方法を試してみました。今、テスト期間中、保留中のSTOPLOSS注文が1つオープンして、それだけです。私の端末が不具合なのかも?
こんにちは。
機能に関して何か問題があった方はいらっしゃいますか?
IsDemo()
?
私はいつも1つの結果を得ます - その口座は本物です(本物かデモかに関係なく)。
こんにちは。
機能に関して何か問題があった方はいらっしゃいますか?
?
私はいつも1つの結果を得る - 私の口座は本物です(本物またはデモであるかどうかに関係なく)。
デモ 口座でコード付きのEAをチャートに表示させました。
雑誌に書き込む。"デモ "です。デモ口座にコード付きのEAを入れています。
ログに書き込まれます。"デモ "です。phibogroupでデモをやっているのですが、なぜかリアル口座と表示されます。あなたのバージョンでは、「これはデモではありません」と表示されています。
なぜかDC自体が曲解されていることが判明
phibogroupでデモをしているのですが、なぜかリアルと表示されます。あなたのバージョンの写真では - それはデモではありません。
なぜかDC自体が変態化していることが判明
ブローカーによっては、1つのサーバーでデモと本番の両方に対応しているところもあります。証券会社のサポート部門にご確認ください。
ありがとうございます。