My EA was taking only 1 trade at a time on a single currency pair, it ignores the other pairs till the current trade is closed. I decided to modify it. Now it's no more trading at all.
int Hour = TimeHour(TimeCurrent());
int DayOfWeek = DayOfWeek();
int total = OrdersTotal();
int count=0;
for(int i=0; i<total; i++)
{
if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol() == _Symbol && OrderMagicNumber()==MagicNumber)
{
Alert("Inside Order Select if");
// Checking if spread is less than 2.0 pips.
if(current_spread <= AllowableSpread)
{
// Checking for days of the week
if(DayOfWeek >= 1 && DayOfWeek <= 5)
{
// Checking for time of the day
if(Hour >= 3 && Hour <= 20)
{
if(ADXValue > 25)
{
if(RSIValue > 50 || RSIValue < 20)
{
if(PreviousFast<PreviousSlow && CurrentFast > CurrentSlow)
ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, Ask-(StopLoss*pips), Ask+(TakeProfit*pips), NULL, MagicNumber, 0, Green);
if(ticket<0)
Print("OrderSend failed with error #",GetLastError());
else
Print("OrderSend placed successfully");
}
if(RSIValue < 50 || RSIValue > 70)
{
if(PreviousFast>PreviousSlow && CurrentFast < CurrentSlow)
ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*pips), Bid-(TakeProfit*pips), NULL, MagicNumber, 0, Red);
if(ticket<0)
Print("OrderSend failed with error #",GetLastError());
else
Print("OrderSend placed successfully");
}
}
}
I have created an expert advisor that calculates some conditions and gives a value either long or short for each condition (+or- 0.1 lots), it then sums all the conditions to give a net long or short position.
It should then either open a new order or close an open one to alter the previous open positions(mlots) to match the target value the trade conditions have calculated(sum) on the change of each new bar; this is done by using the ontick function.
If I use only one or two conditions it works fine, but when I increase the number of conditions (sum can be greater than 0.2 lots or less than -0.2lots) it over trades by one and then closes the position which it should and then over trades by one again which it shouldn't get in to a nasty cycle.
I don't understand why it would work perfectly for two conditions but not for more than two I wonder if anyone has an idea I would be grateful for any input.
This is my first attempt at an EA any thoughts would be greatly appreciated best regards Ken
//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright 2018, K T |
//| https:// |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, K T"
#property link ""
#property version "1.00"
#property strict
#property description "SIMPLE TRADER"
//INPUT PARAMETERS
input double lots=0.1;
input int MagicNumber=1111;//MAGICNO MUST BE UNIQUE
input int condno=1; //1=3/10 10 2=10 10/20 3=ALL
input double test=0.0;
input int spread=1;
input int slippage=10;
input string simble="FTSE100(£)";
input int period=PERIOD_M1;
input double TP=200;
input double SL=100;
input int ma1input=3;
input int ma2input=10;
input int ma3input=20;
input int sleep=0;
//ONINIT TEST FOR CORRECR CONDITIONS
int OnInit()
{
string simble1=simble;
int period1=period;
if (simble1==Symbol()&& period1==Period() && Ask-Bid<=spread)
{
Alert ("CORRECT SYMBOL ", simble," mlots=", mlots(),"sum= ",sum());
Alert ("CORRECT TIME T", period);
return(INIT_SUCCEEDED);
}
else
{
Alert ("INIT FAILED");
Alert ("wrong symbol, time or spread too wide");
return(INIT_FAILED);
}
}
//ON EVERY TICK
void OnTick()
{
double sum1 = sum();
double mlots1 = mlots();
if(sum1 == mlots1)
{
neutral();
return;
}
else if(sum1>mlots1 && mlots1>=0 && mlots1!= sum1)
{
openbuy();
return;
}
else if(sum1>mlots1 && mlots1<0 && mlots1!= sum1)
{
closesell();
return;
}
else if(sum1<mlots1 && mlots1<=0 && mlots1!= sum1)
{
opensell();
return;
}
else if(sum1<mlots1 && mlots1>0 && mlots1!= sum1)
{
closebuy();
return;
}
else
return;
}
//NEUTRAL
void neutral()
{
Alert("T", period, " EQUILIBRIUM ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
return;
}
//OPEN BUY
void openbuy()
{
double TakeProfitLevel;
double StopLossLevel;
TakeProfitLevel = Bid + TP*Point*10; //0.00001 * 10 = 0.0001
StopLossLevel = Bid - SL*Point*10;
if(mlots()!= sum())
{
OrderSend(simble, OP_BUY, lots, Ask, slippage*10, StopLossLevel, TakeProfitLevel, "BUY", MagicNumber);//notice that slippage also has to be multiplied by 10
Alert(MagicNumber," T", period, " OPENBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
else
{
return;
}
}
//OPEN SELL
void opensell()
{
double TakeProfitLevel;
double StopLossLevel;
//here we are assuming that the TakeProfit and StopLoss are entered in Pips
TakeProfitLevel = Ask - TP*Point*10; //0.00001 * 10 = 0.0001
StopLossLevel = Ask + SL*Point*10;
if (mlots()!= sum())
{
OrderSend(simble, OP_SELL, lots, Bid, slippage*10, StopLossLevel, TakeProfitLevel, "SELL", MagicNumber); //notice that slippage also has to be multiplied by 10
Alert(MagicNumber," T", period, " OPENSELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
else
{
return;
}
}
//CLOSE BUY
void closebuy()
{
if(mlots()==sum())
{
neutral();
return;
}
int low=OrderTicket();
int i=OrdersTotal();
for (i = OrdersTotal(); i >=0; i--)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (i<=OrdersTotal() && OrderType()== OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
bool closed = OrderClose( low, OrderLots(), Bid, slippage, White);
Alert("Ticket= ", low);
Alert(MagicNumber," T", period, " CLOSEBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
}
//CLOSE SELL
void closesell()
{
if(mlots()==sum())neutral();
int low=OrderTicket();
int i=OrdersTotal();
for (i = OrdersTotal(); i >=0; i--)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (i<=OrdersTotal() && OrderType()== OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
bool closed = OrderClose( low, OrderLots(), Ask, slippage, White);
Alert("Ticket= ", low);
Alert(MagicNumber," T", period, " CLOSESELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
}
//CONDITION 1
double cond1() //cond 1 3ema 10ma
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
ma2=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 2
double cond2() //cond 2 10ema 10ma
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
ma2=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 3
double cond3() //cond 3 10ema 20ema
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 4
double cond4() //cond 4 10ma 20Ema
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//SELECTING CONDITIONS TO BE INCLUDED
double sum()
{
if(condno==1)
{
return(cond1() + cond2());
}
else if(condno==2)
{
return(cond3() + cond4());
}
else if (condno==3)
{
return(cond1() + cond2()+ cond3() + cond4() );//IF MORE THAN TWO CONDITIONS USED IT OVERTRADES B ONE AND THEN CLOSES ERROR TRADE
}
else
return(cond1() + cond2());
}
//COUNT OF ALL OPEN TRADES
double mlots()
{
double mlots1 = BuyTotalMagicOpen() + SellTotalMagicOpen();
double mlots2 = mlots1/10;
return (mlots2);
}
//COUNT BUY ORDERS
double BuyTotalMagicOpen()
{
int OrderCount = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_BUY) OrderCount++;
}
return (OrderCount);
}
//COUNT SELL ORDERS
double SellTotalMagicOpen()
{
int OrderCount = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_SELL) OrderCount++;
}
return (OrderCount*-1);
}
//CLOSE ALL MAGICNUMBER REFRESHRATES BUSYSLEEP MODE
void CloseThis() {
for (int i = OrdersTotal(); i >=0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
while(IsTradeContextBusy()) Sleep(100);
RefreshRates();
if (OrderType() == OP_BUY && Symbol() == OrderSymbol()
&& MagicNumber == OrderMagicNumber()) {
bool closed = OrderClose( OrderTicket(), OrderLots(), Bid, slippage, Red);
Alert("T", period, " BUY CLOSED ON DEINIT");
}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()
&& MagicNumber == OrderMagicNumber()) {
bool closed = OrderClose( OrderTicket(), OrderLots(), Ask, slippage, Green);
Alert("T", period, " SELL CLOSED ON DEINIT");
}
}
}
//DEINIT
void OnDeinit(const int reason)//MAGIC NO
{
CloseThis();
Alert("T", period, " DEINIT SUCCEEDED");
}
//
I want to calculate the total duration a gif plays. It can be either duration of a gif or frame count of the gif. Have tried using FLAnimatedImage, SDWebImage and YYImage but can't really attain what I am looking for. The gif is loaded from remote url and then I want to calculate the duration it plays.
This is the function that returns the total duration in GIF time units (1 unit = 10 msec).
data is a pointer to GIF data, size is its size.
long Duration(uint8_t *data, long size) {
long desc, time = 0;
uint8_t *buff;
if ((size > 13) && data && (data[0] == 71) && (data[1] == 73)
&& (data[2] == 70) && (data[3] == 56) && (data[5] == 97)
&& ((data[4] == 55) || (data[4] == 57))) {
buff = data + 13 + ((data[10] & 0x80)? 6 << (data[10] & 7) : 0);
if ((size -= buff - data) > 0)
while ((desc = *buff++) != 0x3B) {
size--;
if (desc == 0x2C) {
desc = 9 + ((buff[8] & 0x80)? 6 << (buff[8] & 7) : 0);
buff += desc;
if ((size -= desc) <= 0)
break;
}
else if ((desc == 0x21) && (*buff == 0xF9))
time += *(uint16_t*)(buff + 3);
buff++;
if (--size <= 0)
break;
do {
buff += (desc = 1 + *buff);
if ((size -= desc) <= 0)
return time;
} while (desc > 1);
}
}
return time;
}
This function parses GIF images by hand, extracting frame delay information and summing it.
i have a rails app with user inputs, i have to perform a calculation and store its new value. eg of price is given which was earlier written in js and php
if(count($_POST['price']) >= 0 && !empty($_POST['price']))
{
$price = $_POST['price'];
$sql .= " '". $price ."', ";
switch ($price){
case ($price >= 0 && $price <= 21):
$price_rating = 0;
break;
case ($price >= 22 && $price <= 29):
$price_rating = 5;
break;
case ($price >= 30 && $price <= 39):
$price_rating = 7;
break;
case ($price >= 40 && $price <= 49):
$price_rating = 8;
break;
case ($price >= 50 && $price <= 59):
$price_rating = 6;
break;
default:
$price_rating = 0;
}
}
else
{
$price_rating = 0;
$sql .= " '', ";
}
everything is the same... in the according controller you just need to do
#price = params[:price] (which is the same as $price = $_POST['price'];)
if (0..21).include?(#price)
#price_rating = 0
if ... and so on
I got the x and y by a UITapGestureRecognizer set on the screen, after having obtained the location I find the object touched, so I put the conditions, but does not work. Maybe I put the wrong conditions in objective C? Xcode gives no errors but the function does not work.
-(void)tappedMapOniPad:(int)x andy:(int)y{
NSLog(#"the x is: %d", x);
//the x is: 302
NSLog(#"the y is: %d", y);
//the y is: 37
if((121<x<=181) && (8<y<=51)){ //the error is here
self.stand = 431;
}else if ((181<x<=257) && (8<y<=51)){
self.stand=430;
}else if ((257<x<=330) && (8<y<=51)){
self.stand = 429;
}
NSLog(#"The stand is %d", self.stand);
//The stand is 431
}
How can I do?
121<x<=181
let's assume x := 10 121<10<=181 -> false<=181 -> 0<=181 -> true
you have to do it step by step.
((121 < x) && (x <=181))
let's assume x := 10 ((121 < 10) && (10 <=181)) ->false && true ->false
Replace
if((121<x<=181) && (8<y<=51))
by
if((121 < x && x <= 181) && (8 < y && y <= 51))
(121<x<=181) kind of expression is invalid in Obj-c.
Use, (x>121 && x<=181)
Your full code will be like :
if((x>121 && x<=181) && (y>8 && y<=51)){ //the error is here
self.stand = 431;
}
else if ((x>181 && x<=257) && (y>8 && y<=51)){
self.stand=430;
}
else if ((x> 255 && x<=330) && (y>8 && y<=51)){
self.stand = 429;
}
Or you can optimize it as:
if(y>8 && y<=51){
if (x> 257 && x<=330) {
self.stand = 429;
}
else if(x>181){
self.stand=430;
}
else if(x>121){
self.stand = 431;
}
}
Missing &&
Try
if((121<x&&x <=181)&&(8<y&&y <=51))
Hope it helps