Воопщем проходил я Теорию вероятности и по статистике если отложение ордера будут в радиусе 50пунктов от цены, то при открытии ордера с профитом в10 пунктов легче досягаем - если будет ещё и стоп лос в 10 пунктов (даже спред непомеха) движения тренда великая вещь...
Добавьте стоп лос независимо от StepStop
//+------------------------------------------------------------------+ //| Volfram.mq4 | //| Vova-x@list.ru | //| | //+------------------------------------------------------------------+ #property copyright "Vova-x@list.ru" #property link "" //----------------------------------------- extern int TakeProfit=10; extern int StepStop=45; extern double Lots=0.01; extern bool MoneyManagement=true; extern int MarginPercent=10; //------------------------------------------- int level_sell_stop; int level_buy_stop;
//---------------------------------------------------------- void init() { // int minstop=MarketInfo(Symbol(),MODE_STOPLEVEL); //Print("Уровень стопов: "+minstop); } //----------------------------------------------------------- void start() { if (!IsTradeAllowed()) return; level_buy_stop=0; level_sell_stop=0; StepingStop(); StepingPendings(); if (TotalBuy ()==0 && TotalBuyStop ()==0) SetBuyStop (); if (TotalSell()==0 && TotalSellStop()==0) SetSellStop(); Comment("Level Buy Stop=",level_buy_stop*Point, "\n","Level Sell Stop=",level_sell_stop*Point); } //--------------------------------------------------------------------------------------------- void StepingStop() { if (StepStop<1) return; int ask, bid, open, stop, x; double loss; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) if (OrderType()==OP_BUY) { bid=MathRound(Bid/Point); open=MathRound(OrderOpenPrice()/Point); stop=MathRound(OrderStopLoss()/Point); x=(bid-open)/StepStop; x--; x*=StepStop; level_sell_stop=open+x; if (stop>=open+x) loss=(open+x)*Point; OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE); } if (OrderType()==OP_SELL) { ask=MathRound(Ask/Point); open=MathRound(OrderOpenPrice()/Point); stop=MathRound(OrderStopLoss()/Point); x=(open-ask)/StepStop; x--; x*=StepStop; level_buy_stop=open-x; if (stop>0 && stop<=open-x) loss=(open-x)*Point; OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE); } } } //---------------------------------------------------------------------------- void StepingPendings() { int ask, bid, open; double price, loss, profit; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) if (OrderType()==OP_BUYSTOP) { if (level_buy_stop==0) open=MathRound(OrderOpenPrice()/Point); if (open<=level_buy_stop) price=level_buy_stop*Point; loss=price-StepStop*Point; profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point; OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE); } if (OrderType()==OP_SELLSTOP) { if (level_sell_stop==0) open=MathRound(OrderOpenPrice()/Point); if (open>=level_sell_stop) price=level_sell_stop*Point; loss=price+StepStop*Point; profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point; OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE); } } } //------------------------------------------------------------------- void SetBuyStop() { double lots=LotsCounting(); double price=Bid+StepStop*Point; double loss=price-StepStop*Point; double profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point; int ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE); if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",(GetLastError())); }
void SetSellStop() { double lots=LotsCounting(); double price=Ask-StepStop*Point; double loss=price+StepStop*Point; double profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point; int ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE); if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",(GetLastError())); }
int TotalBuy() { int count=0; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_BUY) count++; } return (count); }
int TotalBuyStop() { int count=0; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_BUYSTOP) count++; } return (count); }
int TotalSell() { int count=0; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_SELL) count++; } return (count); }
int TotalSellStop() { int count=0; for (int i=0; i<OrdersTotal(); i++) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_SELLSTOP) count++; } return (count); }
double LotsCounting() { double lots=Lots; if (MoneyManagement) { double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE); double freemargin=AccountFreeMargin(); lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),1); } if (lots>10) lots=NormalizeDouble(lots,0); if (lots<0.01) lots=0.01; return (lots); }
Не ответили наверно потому, что написание подобного индикатора штука простая и скорее всего, ни кому не нужная.
Спасибо, а все-таки? Или подскажите, может быть в настройках терминала, есть возможность показывать часовые метки более отчетливо по всей длине шкалы времени?
root: Спасибо, а все-таки? Или подскажите, может быть в настройках терминала, есть возможность показывать часовые метки более отчетливо по всей длине шкалы времени?
Я понял, отсутствие этого индикатора последнее, что мешает Вам заработать на Форексе. Точно такого нет, но у Urain'а есть похожий, на 8 линий. Переделайте его, а не сможете, обратитесь к автору, он на форуме.
Здравствуйте. Ребята помогите плиз одной фиговиной. Я про такую не слышал даже - но вдруг есть у кого-нибудь? Идея - в переносе всех выбранных обьектов с одного графика на другой. Т.е. допустим мне надо перенести волновую разметку со всех таймов одного инструмента в одно окно. Сделать разметку заново переключая таймы - затруднительно в виду тяжеловесности расчетов (расчет 30- 50 трендов на М1 выносит терминал в аут - а это всего лишь около 16 - 24 часов графика). Может есть у кого скрипт копирующий присутствующие на графике обьекты (в данном случае - трендовые линии) с последующим переносом всего массива трендовых линий в другое окно? Или может есть возможность совмещения нескольких шаблонов в одном окне?
Воопщем проходил я Теорию вероятности и по статистике если отложение ордера будут в радиусе 50пунктов от цены, то при открытии ордера с профитом в10 пунктов легче досягаем - если будет ещё и стоп лос в 10 пунктов (даже спред непомеха) движения тренда великая вещь...
Добавьте стоп лос независимо от StepStop
//+------------------------------------------------------------------+
//| Volfram.mq4 |
//| Vova-x@list.ru |
//| |
//+------------------------------------------------------------------+
#property copyright "Vova-x@list.ru"
#property link ""
//-----------------------------------------
extern int TakeProfit=10;
extern int StepStop=45;
extern double Lots=0.01;
extern bool MoneyManagement=true;
extern int MarginPercent=10;
//-------------------------------------------
int level_sell_stop;
int level_buy_stop;
//----------------------------------------------------------
void init()
{
// int minstop=MarketInfo(Symbol(),MODE_STOPLEVEL);
//Print("Уровень стопов: "+minstop);
}
//-----------------------------------------------------------
void start()
{
if (!IsTradeAllowed()) return;
level_buy_stop=0;
level_sell_stop=0;
StepingStop();
StepingPendings();
if (TotalBuy ()==0 && TotalBuyStop ()==0) SetBuyStop ();
if (TotalSell()==0 && TotalSellStop()==0) SetSellStop();
Comment("Level Buy Stop=",level_buy_stop*Point,
"\n","Level Sell Stop=",level_sell_stop*Point);
}
//---------------------------------------------------------------------------------------------
void StepingStop()
{
if (StepStop<1) return;
int ask, bid, open, stop, x;
double loss;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol())
if (OrderType()==OP_BUY)
{
bid=MathRound(Bid/Point);
open=MathRound(OrderOpenPrice()/Point);
stop=MathRound(OrderStopLoss()/Point);
x=(bid-open)/StepStop; x--; x*=StepStop;
level_sell_stop=open+x;
if (stop>=open+x)
loss=(open+x)*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
ask=MathRound(Ask/Point);
open=MathRound(OrderOpenPrice()/Point);
stop=MathRound(OrderStopLoss()/Point);
x=(open-ask)/StepStop; x--; x*=StepStop;
level_buy_stop=open-x;
if (stop>0 && stop<=open-x)
loss=(open-x)*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE);
}
}
}
//----------------------------------------------------------------------------
void StepingPendings()
{
int ask, bid, open;
double price, loss, profit;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol())
if (OrderType()==OP_BUYSTOP)
{
if (level_buy_stop==0)
open=MathRound(OrderOpenPrice()/Point);
if (open<=level_buy_stop)
price=level_buy_stop*Point;
loss=price-StepStop*Point;
profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE);
}
if (OrderType()==OP_SELLSTOP)
{
if (level_sell_stop==0)
open=MathRound(OrderOpenPrice()/Point);
if (open>=level_sell_stop)
price=level_sell_stop*Point;
loss=price+StepStop*Point;
profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point;
OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE);
}
}
}
//-------------------------------------------------------------------
void SetBuyStop()
{
double lots=LotsCounting();
double price=Bid+StepStop*Point;
double loss=price-StepStop*Point;
double profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
int ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE);
if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",(GetLastError()));
}
void SetSellStop()
{
double lots=LotsCounting();
double price=Ask-StepStop*Point;
double loss=price+StepStop*Point;
double profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point;
int ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE);
if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",(GetLastError()));
}
int TotalBuy()
{
int count=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY) count++;
}
return (count);
}
int TotalBuyStop()
{
int count=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUYSTOP) count++;
}
return (count);
}
int TotalSell()
{
int count=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_SELL) count++;
}
return (count);
}
int TotalSellStop()
{
int count=0;
for (int i=0; i<OrdersTotal(); i++)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_SELLSTOP) count++;
}
return (count);
}
double LotsCounting()
{
double lots=Lots;
if (MoneyManagement)
{
double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE);
double freemargin=AccountFreeMargin();
lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),1);
}
if (lots>10) lots=NormalizeDouble(lots,0);
if (lots<0.01) lots=0.01;
return (lots);
}
// End
Не ответили наверно потому, что написание подобного индикатора штука простая и скорее всего, ни кому не нужная.
Народ, помогите! Не получается расчитать максимально возможный объем открываемой сделки
Max_lots постоянно равен нулю!
И второй вопрос, как рассчитывается УРОВЕНЬ??
Спасибо, а все-таки? Или подскажите, может быть в настройках терминала, есть возможность показывать часовые метки более отчетливо по всей длине шкалы времени?
по простому объем можно так посчитать
а уровень = AccountEquity() / AccountFreeMargin() * 100;
а уровень = AccountEquity() / AccountFreeMargin() * 100;
НЕ правильно. Не получается Уровень по этой формуле
да, ошибся, уровень = AccountEquity() / AccountMargin() * 100;
да, ошибся, уровень = AccountEquity() / AccountMargin() * 100;
Извините за флуд,но сегодня можно.
=====
И качнутся бессмысленной высью
Пара фраз, залетевших отсюда...
===========
Андрей Вознесенский.