Всем привет. Ниже выложен элементарный урывок программы, который у меня не получается довести до конца. Мне нужно сделать так, чтобы он перед тем как ставить новый ордер проверял есть ли в том месте (с такой же ценой) другой орден, если есть, то пропустить, если нету – ставить. А то он у меня наставит ордеров до заданной границы, а потом по втором, по третьем кругу выставляет. Для запуска ставите на автомат, ставите бай стоп, и увидите результат. Если кто сможет дописать, пожалуйста, не поленитесь. Когда все получится – вознаграждение обязательно!!!
extern double Lot=0.01;
extern bool Ustan_BuyStop=true;
extern bool Ustan_SellStop=true;
double Dist=10000.0;
string SMB;
double NewPrice,SL,TP;
int i,z;
int start()
{
RefreshRates();
SMB=Symbol();
if(Ustan_BuyStop || Ustan_SellStop) {UstanOtlozh();}
}
return(0);
void UstanOtlozh()
{
double OldPrice=WindowPriceOnDropped();
RefreshRates();
SMB=Symbol();
{
int i=1;
while(i<=OrdersTotal())
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!= SMB) continue;
int Tip=OrderType();
if (Tip<2) continue;
double Price=OrderOpenPrice();
{
NewPrice=Price;
while(NewPrice<=Ask+300*Point||NewPrice>=Ask+20*Po int)
{
NewPrice=NewPrice+20*Point;
SL=NewPrice-20*Point;
TP=NewPrice+20*Point;
OrderSend(SMB,OP_BUYSTOP,Lot,NewPrice,3,SL,TP,NULL,0,CLR_NONE);
if(NewPrice>Ask+300*Point||NewPrice<Ask+20*Point)
return;
}}
}
}
}
}
int Ord(double Price, int MinShag)
{
int _OrdersTotal=OrdersTotal(),i;
int total=0;
string Sy=Symbol();
for (i=_OrdersTotal-1; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) {
if (OrderSymbol() == Sy) {
if(OrderOpenPrice()+MinShag*Point>Price&&OrderOpenPrice()-MinShag*Point<Price){total=total+1;}}}}
return(total);
}
Воть..
Функция проверяет наличие ордеров попавших в Price, с диапазоном MinShag, и вовращает их количество.
int Ord(double Price, int MinShag)
{
int _OrdersTotal=OrdersTotal(),i;
int total=0;
string Sy=Symbol();
for (i=_OrdersTotal-1; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) {
if (OrderSymbol() == Sy) {
if(OrderOpenPrice()+MinShag*Point>Price&&OrderOpenPrice()-MinShag*Point<Price){total=total+1;}}}}
return(total);
}
Воть..
Функция проверяет наличие ордеров попавших в Price, с диапазоном MinShag, и вовращает их количество.
Хлопцы, спасибо, конечно, вам всем за попытки помочь, но я не очень силен в программировании, я писал прогу, вырезая целые куски и ф-ции из многих уже готовых программ. Разбирался, дорабатывал, подгонял под свою, конечно, я сам. Просто прога с такой ф-цией мне не попадалась (в примере я ее сдер бы), а написать самому - мне слабо. Так что не поленитесь, попробуйте вставить ее в мой экземпляр, если заработает, то по примеру я уже сделаю что захочу.
Вот, это мне скинули еще два года назад. А я вставить не смог. Если она может чем-то помочь, конечно.
// Функция возвращает истину - есть ордер около текущей цены, ложь - нет ордера.
// Без проверок на магик и символ и корректности выбора ордера, т.е. для тестера
bool DoesOrderExist(double delta) {
for(int i=OrdersTotal()-1; i>=0; i--)
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType() == OP_SELLSTOP && MathAbs(OrderOpenPrice()-Bid) < delta*Point) // Этот ордер в пределах 5 пунктов от текущей цены
return(true);
if (OrderType() == OP_BUYSTOP && MathAbs(OrderOpenPrice()-Ask) < delta*Point) // Этот ордер в пределах 5 пунктов от текущей цены
return(true);
}
return(false);
}
забей... ищи 10 баксов и в раздел Работа на мт5 форуме...
а чем готовый сервис не устраивает ?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
extern double Lot=0.01;
extern bool Ustan_BuyStop=true;
extern bool Ustan_SellStop=true;
double Dist=10000.0;
string SMB;
double NewPrice,SL,TP;
int i,z;
int start()
{
RefreshRates();
SMB=Symbol();
if(Ustan_BuyStop || Ustan_SellStop) {UstanOtlozh();}
}
return(0);
void UstanOtlozh()
{
double OldPrice=WindowPriceOnDropped();
RefreshRates();
SMB=Symbol();
{
int i=1;
while(i<=OrdersTotal())
{
if (OrderSelect(i-1,SELECT_BY_POS)==true)
{
if (OrderSymbol()!= SMB) continue;
int Tip=OrderType();
if (Tip<2) continue;
double Price=OrderOpenPrice();
{
NewPrice=Price;
while(NewPrice<=Ask+300*Point||NewPrice>=Ask+20*Po int)
{
NewPrice=NewPrice+20*Point;
SL=NewPrice-20*Point;
TP=NewPrice+20*Point;
OrderSend(SMB,OP_BUYSTOP,Lot,NewPrice,3,SL,TP,NULL,0,CLR_NONE);
if(NewPrice>Ask+300*Point||NewPrice<Ask+20*Point)
return;
}}
}
}
}
}