[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 87

 
Mathemat:

Извините, но это - точно в Анналы. Незнание английского языка не освобождает от ответственности.

Не знаю я, какой спред на EURUSD на микро, честно. Вероятно, Вам на этот форум вход заказан. Эти гады все время что-нибудь придумают - только чтобы Вас туда не пустить.

Удалось зарегиться, спасибо.
 

Здравствуйте, помогите пожалуйста с одним, как я полагаю элементарным, моментом.

int start()
{
OrderSend(Symbol(),OP_BUY,1,Ask,2,0,0);
Alert(GetLastError());
return;
}

Скрипт открывает рыночный ордер, всё ок. Но если я выставляю какое либо значение SL или TP, то выдаётся ошибка "неправильные стопы".

int start()
{
OrderSend(Symbol(),OP_BUY,1,Ask,2,Bid-50*Point,Bid+50*Point);
Alert(GetLastError());
return;
}

Вот этот код уже не работает. В чём дело? Никак не могу догнать...

int start()
{
OrderSend(Symbol(),OP_BUY,1,Ask,2,1.31845,1.40000);
Alert(GetLastError());
return;
}

Причём не работает, даже если я ввожу численные значения стопа и профита. С минимальной дистанцией от ордера до стоп приказа всё ок.

 

Уважаемые профессионалы! Возник вопрос. Есть советник, торгует по нескольким критериям, как сделать чтобы он модифицировал ордера раздельно? например открыто два BUY по разным сигналам, у одного уровень безубытка 90пп с шагом 40, у другого 50 с шагом 50. как только не пробовал не получается. Помогите кто знает. Заранее спасибо!

 
azik1306:

Уважаемые профессионалы! Возник вопрос. Есть советник, торгует по нескольким критериям, как сделать чтобы он модифицировал ордера раздельно? например открыто два BUY по разным сигналам, у одного уровень безубытка 90пп с шагом 40, у другого 50 с шагом 50. как только не пробовал не получается. Помогите кто знает. Заранее спасибо!

-можно организовать открытие сделок по разным сигналам с разными Magic-номерами

-можно при открытии сделок ставить "метки" (например тот же уровень трала) в поле комментарий и потом его анализировать

не видя кода по вашему вопросу не совсем понятно что именно Вы хотите делать раздельно

 

код примерно такой:

for( int c=1; c<=OrdersTotal(); c++) // Цикл перебора ордер
{
OrderSelect(c-1,SELECT_BY_POS); // Если есть следующий
// Анализ ордеров:
if(OrderMagicNumber()<1000)

if (R==1 && SL<OrderOpenPrice() && Bid-OrderOpenPrice()>((NoLoss)*Point) )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*(NoLoss),OrderTakeProfit(),0,Blue);
return;
}
if (R==2 && SL>OrderOpenPrice() && OrderOpenPrice()-Ask>((NoLoss)*Point))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*(NoLoss),OrderTakeProfit(),0,Blue);
return;
}
if (R==1 && SL>=OrderOpenPrice() && Bid - SL > ((NoLoss*Point)+(StepLoss*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss,OrderTakeProfit(),0,Blue);
return;
}
if (R==2 && SL<=OrderOpenPrice() && SL-Ask>((NoLoss*Point)+(StepLoss*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss,OrderTakeProfit(),0,Blue);
return;
}
return;
}
//--------------------------------------------------------------------

for(c=1; c<=OrdersTotal(); c++) // Цикл перебора ордер
{
OrderSelect(c-1,SELECT_BY_POS); // Если есть следующий
// Анализ ордеров:
if (OrderMagicNumber()>1000)
if (Z==3 && Bid-OrderOpenPrice()>((NoLoss1)*Point) )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
if (Z==4 && SL1>OrderOpenPrice() && OrderOpenPrice()-Ask>NoLoss1*Point)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
if (Z==3 && SL1>=OrderOpenPrice() && Bid - SL1 > ((NoLoss1*Point)+(StepLoss1*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
if (Z==4 && SL1<=OrderOpenPrice() && SL1-Ask>((NoLoss1*Point)+(StepLoss1*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
return;
}

//--------------------------------------------------------------------
// Стоимость ордеров
RefreshRates(); // Обновление данных
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов
Free =AccountFreeMargin(); // Свободн средства
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера

if (Lots > 0) // Если заданы лоты,то
Lts =Lots; // с ними и работаем
else // % свободных средств
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия

if(Lts < Min_Lot) Lts=Min_Lot; // Не меньше минимальн
if (Lts*One_Lot > Free) // Лот дороже свободн.
{
Alert(" Не хватает денег на ", Lts," лотов");
return; // Выход из start()
}
//--------------------------------------------------------------- 8 --
// Открытие ордеров

{
if (Total<2 && Opn_B==true && B==false)
{
// критерий откр. Buy
RefreshRates(); // Обновление данных
SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP,NULL,y);//Открытие Buy
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
B=true;
S=false;
Y=OrderMagicNumber();
R=1;
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
// Выход из start()
}
if (Total<2 && Opn_S==true && S==false) // Открытых орд. нет +
{
Sleep(10000); // критерий откр. Sell
RefreshRates(); // Обновление данных
SL=Ask + New_Stop(StopLoss)*Point; // Вычисление SL откр.
TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP,NULL,y);//Открытие Sel
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
S=true;
B=false;
Y=OrderMagicNumber();
R=2;
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
// Выход из start()
}

if (Total<2 && Opn_B1==true && B1==false)
{
RefreshRates(); // Обновление данных
SL1=Bid - New_Stop1(StopLoss1)*Point; // Вычисление SL откр.
TP1=Bid + New_Stop1(TakeProfit1)*Point; // Вычисление TP откр.
Alert("Попытка открыть Buy. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL1,TP1,NULL,x);//Открытие Buy
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Buy ",Ticket);
B1=true;
S1=false;
X=OrderMagicNumber();
Z=3;
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
// Выход из start()
}
if (Total<2 && Opn_S1==true && S1==false) // Открытых орд. нет +
{
Sleep(10000); // критерий откр. Sell
RefreshRates(); // Обновление данных
SL1=Ask + New_Stop1(StopLoss1)*Point; // Вычисление SL откр.
TP1=Ask - New_Stop1(TakeProfit1)*Point; // Вычисление TP откр.
Alert("Попытка открыть Sell. Ожидание ответа..");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL1,TP1,NULL,x);//Открытие Sel
if (Ticket > 0) // Получилось :)
{
Alert ("Открыт ордер Sell ",Ticket);
S1=true;
B1=false;
X=OrderMagicNumber();
Z=4;
return; // Выход из start()
}
if (Fun_Error(GetLastError())==1) // Обработка ошибок
continue; // Повторная попытка
// Выход из start()
}
break; // Выход из while
}

 
пробовал и через ордерселект, и через маджик, советник путает ордера
 
azik1306:

код примерно такой:


Такие широкие коды прицепляйте файлом, или на крайняк через SRC (выбирается в верхней полоске редактирования), а то глазу утомительно читать такие строки.
 
azik1306:

код примерно такой:

for( int c=1; c<=OrdersTotal(); c++) // Цикл перебора ордер
{
OrderSelect(c-1,SELECT_BY_POS); // Если есть следующий
// Анализ ордеров:
if(OrderMagicNumber()<1000)
if (R==1 && SL<OrderOpenPrice() && Bid-OrderOpenPrice()>((NoLoss)*Point) )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*(NoLoss),OrderTakeProfit(),0,Blue);
return;
}
if (R==2 && SL>OrderOpenPrice() && OrderOpenPrice()-Ask>((NoLoss)*Point))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*(NoLoss),OrderTakeProfit(),0,Blue);
return;
}
if (R==1 && SL>=OrderOpenPrice() && Bid - SL > ((NoLoss*Point)+(StepLoss*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss,OrderTakeProfit(),0,Blue);
return;
}
if (R==2 && SL<=OrderOpenPrice() && SL-Ask>((NoLoss*Point)+(StepLoss*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss,OrderTakeProfit(),0,Blue);
return;
}
return;
}
//--------------------------------------------------------------------
// В принципе, дальше можно ничего не писать: все равно выполняться не будет

for(c=1; c<=OrdersTotal(); c++) // Цикл перебора ордер

{
OrderSelect(c-1,SELECT_BY_POS); // Если есть следующий
// Анализ ордеров:
if (OrderMagicNumber()>1000)
if (Z==3 && Bid-OrderOpenPrice()>((NoLoss1)*Point) )
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}

if (Z==4 && SL1>OrderOpenPrice() && OrderOpenPrice()-Ask>NoLoss1*Point)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
if (Z==3 && SL1>=OrderOpenPrice() && Bid - SL1 > ((NoLoss1*Point)+(StepLoss1*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
if (Z==4 && SL1<=OrderOpenPrice() && SL1-Ask>((NoLoss1*Point)+(StepLoss1*Point)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*NoLoss1,OrderTakeProfit(),0,Blue);
return;
}
return; // Но "для надежности" сделан еще и "контрольный выстрел" ;)
}

........ Все остальное не имеет значения .......

//

//--------------------------------------------------------------------
// Стоимость ордеров

 
Спасибо, сейчас попробую
 
Поправил код, но никак не хочет советник к каждому ордеру подойти индивидуально
Причина обращения: