[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 767

 
FoxUA:

да часть кода работает а часть говорить о 4107 и 130 ошибке и что самое интересное цену берут из одной и тойже функции и работают на одной и тойже функции открытия видать дето в условиях ошибка препряталась


Попробуйте где то такую конструкцию, этот пример для моего случая .

if (OrderSend(Symbol(),OP_BUYSTOP,Lot,OpenPrice,0,Ask,0,0,Mg,0,Red)== -1)
Print( "Ошибка 1 OP_BUYSTOP "," Открытие=",OpenPrice," Стоп Лосс=",Ask," Тралл=",TrallBuy," StopLoss=",StopLoss) ;

результат в журнале смотрим 
 

 

Добрый день знатоки. Помогите разобраться вот код...

//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICEA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}

//+------------------------------------------------------------------+
//| Calculate optimal lot size |
//+------------------------------------------------------------------+
double LotSize(){
double lotMM;
if(PairsTraded==0){
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 10;
} else {
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000 /PairsTraded) / 10 ;
}
if (MM==true){
if (lotMM < 0.1) lotMM = Lots;
if (lotMM > 1.0) lotMM = MathCeil(lotMM);
if (lotMM > 100) lotMM = MaxLots;
}
else lotMM = Lots;
return (lotMM);
}

//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double CCI5,CCI15,CCI30,CCIH1,CCIH4;
int send;

//----MultitimeFrame CCI setting


CCI5 = iCCI(NULL,PERIOD_M5,50,PRICE_CLOSE,0);
CCI15 = iCCI(NULL,PERIOD_M15,50,PRICE_CLOSE,0);
CCI30 = iCCI(NULL,PERIOD_M30,50,PRICE_CLOSE,0);
CCIH1 = iCCI(NULL,PERIOD_H1,50,PRICE_CLOSE,0);


//----


//---- sell conditions
if ((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//op sell
{
send=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red);
return;
}

//---- buy conditions
if ((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op buy
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+"-Buy",MAGICEA,0,Blue);
return;
}
}

//----

//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
//----


//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICEA || OrderSymbol()!=Symbol()) continue;

//---- check order type
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderStopLoss()){

if (Bid > OrderOpenPrice()+TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,0,0,White);
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-1*Point,0,0,White);
}
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && Ask-TrailingStop*Point < OrderStopLoss()){

if (Ask < OrderOpenPrice()-TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White);
}
} else {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+1*Point,0,0,White);
}
}

//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;

//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();

//----
}
//+------------------------------------------------------------------+

никак не пойму что я сделал не так мне нужно чтобы он открывал только одну сделку при сформировавшемся условии и после её закрытие до следующего условия не открывал больше.. а у меня получилось что он открывает я закрываю к примеру вучную и он опять открывает туда же что за ж???

 
mydone:

Добрый день знатоки. Помогите разобраться вот код...

... код ...

никак не пойму что я сделал не так мне нужно чтобы он открывал только одну сделку при сформировавшемся условии и после её закрытие до следующего условия не открывал больше.. а у меня получилось что он открывает я закрываю к примеру вучную и он опять открывает туда же что за ж???

Он у вас и будет открывать пока условие на открытие существует.

Сделайте проверку на то, что по данному сигналу уже открывалась позиция, например bool OpnPose = false; Перед открытием позиции по этому сигналу проверяете флаг и если он ещё не установлен (OpnPose == false), открываете позу. При её открытии, если она действительно открылась и находится в рынке, устанавливаете флаг открытия по данному сигналу: OpnPose = true; Как только придёт новый сигнал - этот сбрасываете:
OpnPose = false;

 
да можно проще сделать, после срабатывания сигнала поставить счетчик, чтобы в течении 2х-3х свечей ничего больше не открывалось, так что если он закроет вручную больше ничего не откроется, а счетчик через пару свечей отменит запрет на открытие
 

спасибо

 
Techno:
да можно проще сделать, после срабатывания сигнала поставить счетчик, чтобы в течении 2х-3х свечей ничего больше не открывалось, так что если он закроет вручную больше ничего не откроется, а счетчик через пару свечей отменит запрет на открытие
И после отмены запрета, советник опять воткнёт ордерочек в рынок... А если он решит закрыть позу через 10, 15, 20 свечей и больше не открываться, даже если сигнал всё ещё есть? В пятницу, например...
 
artmedia70:
И после отмены запрета, советник опять воткнёт ордерочек в рынок... А если он решит закрыть позу через 10, 15, 20 свечей и больше не открываться, даже если сигнал всё ещё есть? В пятницу, например...
Уже даже через одну свечу будет уже совершенно другой сигнал, который нужно будет учитывать. 3 свечки подождать достаточно чтобы первый сигнал точно пропал. Кстати используется индюк с временем 5 15 30 и 60, поэтому 3х 30и минутных свечей или 15-и минутных хватит
 

вопрос как зделать если появился новый ордер от пример токо наоорот если появился закрытый ордер "if(TotalHistoryOrders<OrdersHistoryTotal())// в истории появился ещё 1 ордер" а мне надо чтоб открытый также определялся

 
FoxUA:

вопрос как зделать если появился новый ордер от пример токо наоорот если появился закрытый ордер "if(TotalHistoryOrders<OrdersHistoryTotal())// в истории появился ещё 1 ордер" а мне надо чтоб открытый также определялся

при переборе всех ордеров и отсеивании лишних веди подсчет количества, число это запоминай, если с новым циклом число изменилось, значит ну либо появился новый, либо исчез открытый..
 
Techno:
при переборе всех ордеров и отсеивании лишних веди подсчет количества, число это запоминай, если с новым циклом число изменилось, значит ну либо появился новый, либо исчез открытый..


мне просто надо функцию вызвать и все, надо просто одна строчка " если ордеров больше на один чем .... то" и все а вы тут целую функцию мне предлагаете

вот как у меня хранятся данные о ордерах

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic
Причина обращения: