1011001000110111100100001111110111010010100010000110011111111101101010100100101000010001101111100110100011100010000111001010111101111000110100110110010000001011110110100101111100001010101000011010001011000011000001111011101010011000100100111100011110000101001110110011100111100011101100000011110000111101011001101101000110110111010111101100011011000011011011001110110010100111000100111111101000000010 1110110001010010101001110110110100110110100000101010010110001011101011000011010001110001000010100101110011000111110101000010110111101100100011011001011010111000010101100010010001000000110110011110011001000010111100111010101011001110001100011000010101000010110000110101111101111111100100011010110100011000110101001110000010101110100001011100001000110011110101001001100110000000111111001011001010011010 0011110100010001010110011001111011001001100010110111101000110011000101010101111111100000010110101001010110000010101101111010011001110011111100111110000101010101111111010110001100101111000011110110000001111010100010001010001000111011011101110110111010101111010110011001011100000000110010001111010001101011101101011000101011100011100110011000100010010010111110111100101101010111001010010100010110110011 1110010111011111110011111010100011011100100100101110110011000100000010001010101100110100110000011010111101010111111011011000100000111001101111100101010000101011001000111010000010110101110011011100001100101110101101000000001110011101010010011001001011001101011101001001101011011001010010000000110111100000101011001110110010011010001101101110101110100110101011111001111010001000110110101011010101011000 0001111010010110100111110101011010101001001110111111101011110011110011110011001000010101011011100011111110100111111101101101101100001100011001101111010110011110011001001011000000010111100100011101011010111000101100001101010111110010000000110111111011100100110001001100111001011100001110100001000111100000001110101101110001111010111001011101010110010100110010110001000001010001000100011110010001000010 0101100010111101110010100111011111010000111110011001011001001100010110100100000101010000100100110111001101000101111011111010000011111011101000101000100111000010100001110001111010001101011100111000100010110101100101000001000010101111111100111010101011011100100000111011110110110011000111010100100001011000100101101110001000101000010101111001001111001110001000100111111010010111101101110010011010110100 0000111010001010001010110010101011111101001000111011001011101011000111001001111011100000000011110001001011100011010000111001110010110110100100101101010101000101111111110111111001100110100100101010101011111110100011110101101110111011100010100111000000011011101010010100000101001000100101011100110000100101010001111010000001110001110011111010111000101111000110101110100111011010000011010101101111011011 0001100001111011001100110001001100111000100111111101001000010001100000110101101111101001000001111101111010001000010101011011100110001011101111011100010010000111001110101011001100111000010010010001111000100000001111110101110010100010000010000001001100011111110010101110001000101111101100101100100010100101101011001101110110001001001010101011010000110101000010110010111100111011010101010100010010110001 1011010011001110001100001101010101101111011110011111110011011101111011000000101111111011111000100111110100011001011111110111110010000000000010100011111111010111101110101110010011011000001011111110011000001010001001100111110101000101100011101000011011010100100000100010001001110111110001010100010101001111000011000100011101101011111110000011101110010000000010000110001010111000110110000100010110000110 0100101001101110001101000011001111011110010111000110010001100101100111000101110111110110100100010101000100001111011010101110100001010110001111111011111001010000101000001011111101010101000111010110101001111011011111001100100111110110101110001100111000101000100000100000010100110100010110110101000101100011110001001001010100011000001001100001001001011010100001110000110110010001010001011100011101100001 1010101101011011100101000101100000010000010011110001010101111011100011101100001101101100001111011000011110001110000101000011110010110010000001100110000000001110100000100010001001110001001010100101010110001011001100100101011001111000001111001100001101111100101000000001110011101001001100010011100001011001000001101111011000110010011110010011110100001111101101001101000110011000011100010000101000001100 0101001111000001101110100000000010101110110010000111010011011110010101001011000010000000011010010001011100001010110100011011011011101011101101110101110110000010101000000000010101101011101111001110101011001101000111010110100100000000011010000100101100111111011010111100101111101100001010110001011101100000010000101111111101011000000011100001010101011110100100000010111100000011111111100001101111111000 1011111101111001001110111100101000001100001100001011001011001010101110011011111100000100101111101101011000110000111010001000001000011100101010111011010000101100001100110011110010011001111111100001010011110000010110000110011011011100001001101011100101010001100000001110110000010010101001000011110011110110011000011111111010011110100100000000000101111000000111011101010011001010111010000100111111111011 1011001110011001110000001000010110110101001001001110110110101010101111111000110001111010111100111010110011001111101010001000101000101001110000010010110100111111011100010011001001010100000000011000100111101011001000111010101110000011101111001000100111111111101111111101100000010001110101011001010001111000011110001101010100011010111011100101111111101100001111110100000110000011101110010010101111111111 1000001010111011001101010101110001001111011011010011011110011111011001100011100111100001010010011110000000111001001110001111010010111001101010100010010100101111100000101001010111001110101001101100010111100011100101011011100111010101111101100000100100000101101011001001000100010111011001110010101000010100001110010001100010100100000100101000100000000011101011000100011000100001100101101110000011101110 0100001111100111110011111110001111001010001000011100100000101101101011011110000111000010100110000010001101000110100101111100001001010010100011110110101001100100111110101100011010000110011110010101000111101000101101011000010111010010000010011100110010111101011001010000111001000110110111000111001101100001111010101000100011010011010101101111100010111111011001100011010010110000111001000001100101100100 1000001100011110101110101110001010010010001010001011011110100010110010001100001100011001110100110111000110101110110010110110001100100010111111010110100001010110001100011110111000000001110001110001100111010110001111110111100111110100111100110001011110010111100001110001000111001011101001000000010001001111011000111101101001011001001001110011110111001010000101010101101101111110101001001110101010000010 1011100010100100000001101001100110101101111111010000111000000101101001100110010001110011110111110110110101001110101001101001011011111100000000011001000001000010000110101011111100010111010010101010000010110000101000011101111000010101101001000010100011101101010111100110100100111010000010001100100111011010000011111000001101101000110000101100000110101100110110100111000000011010100010010110100100010101 0101100111100101111101010000000010000011100001100110001000001001011000001000010010111110101100001011100011110101001111011001011101110100110000101100101000000001111101110101101011100000111010011110101111111111100101011100101001111011010101011101101011110101010011101111000110001101011110111111101001000011111100100111100111100101101101100111111110001110011100100000100110000110001010011111110110011010 0111100110001100111110011110000100100010000001111000001000010001111111010100110110011100001101100010100010101110100111010010111011110001011111000111110000101111100010001100000001000001011001110101100000110101110000011101001101001010000011111010101010100100101000110100101110001110110010100000101001100010101001010000101010000100111011101001111000001110010110010000101000101101011101001011101011010101 1110110101001000100001010101110010000100011011000000010100001110000100111010000011000110010001100101011100011110001101101101101011000110111010011111111100000001010100111110010000010100111011101101011001100101100001000110000011101110010000000101101100110111010111010010000011110011010010010010110011011110000101010011110010111111001010110010001110100001111100010010000101110011100011001111111001011010 0101100111111001011000011010110010101011111000110010011010111111010101011111111110101000011010101101100000101111111000111010110010010000011111100011100000100011101111101000111100010111001110110100011101110001101100000000111010001101100101011101101101001101011100110000001100011110001010111111101100101100100001110100010111100011100111001011010011011100011010001001011101100001010001100001001100101010 1110000110100111010101011010000010100011111110110101011001101111100000100111011100011110110101101111001010100000101101111011010010000111000011101010001100100010100111000000001101001001010100000001111110011111100011100000000101000100111010111011111011101011010111011011001100001011000110100111100011110000110011001011011111010110110001011101100101100100011010000100001001000010110001110100111001111100 0011111010001000110011111101111010100010010000000111100011111110010000110001001111001111100100100000010011110100010110100101001010011111101101100110111001100110000011000010100110010111011010000111101000101100110110100111011011010101100011111000100010110011100011111011110110101111010000010100000111110101011101001110110101011010001011001011001000101100100001100001001111100011101110101111011111000011 1100011000101100100010001110001010011001100110000000100011100001110000010100101110011101000001100101011010000000001001011010010001010010010010010101111011111001010001111111000101001100110000110110101001011110011110010010101101000101100111001011010001110100001010110001111010100011101000001110010100100100111110010101001000011001010110101100010011001001101110101110000110110000001001110101010001100111 1010101010111111101110110100000011111100111111101011100001001101101011110100100001001000010001110101001001001001100010110010010111101000011010001100100110100011000110001101101010110001100111100111010000001100110010010011000011011011011001111110001101001100100111100001110111110110010010111111101011100111111100101010111010101111010110010111011001101110011010001000101010010101001000101110100010111001 1010011100101100111011001101011110001000010100001101111110000100111000011011000110000010111010100010111111101111101111011011010100101110111001101011011101100100011001010110000100011110011000111110011100110000101110110001000101011001100011001100010110010000101010111100000100011001110000001010110001001001100111100011010000001111001011001110011001010011000011010100011010000111100011101101101011111100 1001011010011100100011111101110000000101101111110111101010101001110010000010111100110100110110011011000001111011001011101100101011001000001010100111011011111110111001111001111000001010111101010101110011111001100000111110101000111111110010111111110110101110110000100110111110101110010101101011110110111000100111101000000111111111011101101111000110001100111011000011111101000011101011111110010110111100 1011110111001010010001001101111011110101110000010110110011110000101001010011110011000001000100110110011001111101110100110001011111010100100010001101111000110001001101110110011100101011110111110110110101110001111001100001011100000111000000011000011011111100101011110011100000000100110000000100100011110001001100111110010001101000001001001011010111111001110010101000111100010000100011100111100110011101 1111010101000110110111010110000001101110100110111111101100011111011010101100001101011101100111001101010100101001110010101101100001011011100100001110001010000010000101110101100100000011000100011001011000100101101000010111011001101010110100000000101010111010000011110111010100001010000001010000100001010101011011000010010001001100101100101100011111110010111000101100100110101111001110101011000110111110 1001101000110001010010101111000000111101111001101101001000011011010001001011111011101111110111000100101011001100101000110101000110000011011111111111000101000010010101111111101001000011000101101010101111101011001011110000011000011010011010000111000111000011101011010100110010001001110011101110001110100100010101111101100100101111110010101111110010100111100001010100000111111000101100001000111100110110 1111111110000110001001000100111101000100011000001111001100101010100111100100010100010101100010010010011101010011010000111000001101000011001011110011001010100100110101101110010011110101100000001111100000111111111011000111001110000010111100010001110010111101111101111000101010111011010010010111101100111100100001000000011111010111001001001000001100111001100011101011001101010110001000101111110001011011 0110000111101111011110101111111011011110011011110101010110110011001100101010001001011011101111110111110011101111111101101111111000011101000111110100110111011011110010000100011100110100000001100010100001011111111111111000111001111010001111001100011110100110101101000111000111011101001101111001110010100010101100111000000001011101010111111000000011001110011111011111101011110001110100011100011111101101 0110011010100011001011101011100110011111011011001111100101011000110110101110011010100111101101100011111000000110001101010000000000100011011011001111110011011101010001011011100010111011101000000111001000010100100110111000001101111000000110110011001100000101111011111010010011011101101001001001101001011000110001001001001100110001100011001001101110111101001101111010111011101111001101111100111111010000 0000100111011110000111010100000010110010010011001100111100110110010110011001001101110111100000100011000101000100011001110100001010000100111000111101111101001011011100110101101111111101100010110100110111101111101111100101111110001010011100001100111110111101101000111110100100010110001011010001000011101111001000111101010001100100110101101010011111110110001000110101010101010100001110111011000101010100 0100000010100001010011000010100000110100100010000110111000110010000110101001110011111111111001001101000110011011101100111000011100000100100111100100001111111101010110100111011010010100111111001100111111001000100100011010001101000000001101110011111111010010011011100110100011001000001011100010001111110001010001110010010110010001110101000110001101111100001010011011000001111010010011100001101000101001 1010110110110110011011111110011011110000010000111100100111010001111010010011010110100010111101000111101100011010010000101010111000010000000011111000101001011101111000000011101111000101011111101010011100010010110000110010100000001111001010011001100101000001111111110110110010011011010101010100101101100100000110110001010111010110000111000011000111000111100000000001011110111001000001101011011110000101 1001101001110000011001110010111010110100101011001101101111001011100001100000001110000100100110001110000011111011101111010010011101100111101111111101110100001010011010100010011001100100011011101000111110101011010101000011000001101110111000110110100111001001110111010001001011101011000110111011000100001010111111110011110001010001001001000000010111111000101101000000001111011100001011100110011101111010 0111010011001110111011001100011110111111111100011101000110001101001001010110001001000111110011000100000111100101001011111000011000100110001010101000100001111011111011110110011101000110010001001001101011000100110101100011001011111101100110000000010011010011111010001001110000101011101001100111101110101101010000101010110111011101001001100000100101101001001011101010100101000011100011010100011000011111 0001100001101101101111100101010010101001001111110110001100100100010110101010100001110011001100101111010100110001010001110000001111101011101011100100010100110000101100100111101100001010000101001110101011000010010100000111010010111111111000010001100110110110110111001110011011100110101110001110000101010110011010010000000111100001100000111100001011000101111010100010110000011111010010111010100100110101 1000011101010100001110001111000011101110110001100010000100011110101011110000000101101010100100111001011101111010001101101110010100111111101001001011010110000011000111110001100100100111110011000110101100101010100011111000111100100000001010110100110000001100111000100000100011001110110001100101111100011100001110101001110100111100101111101111100110111000010111111100011001101100100111011111100100001010 1101110010101010100100010001000100101101101000101011101100000101000000010011001000110001010100010111100110001001110101000010000001011001011100101000110101101010111001101111011001110101100000011111001001101011011000001001001001100000101101001011101001001000000111011111011100011010000100100111110010100110011101110000101000110010010010111011010010001100001110111110010111100001001001111000111000111110 0111011010111011100000101001001000101011100110001100100100000110000111100000110101111111001001100101000110000001111000000100011111001011101001000101111110110001110001110111000010011000011010001000001111000011111010010011011100010011000001101100000100111100100000111101100001111100001100001100001111110010001100111010010001011011111011000110110101100100110000111110001110010000011010100111010011001000 0010110000001111010010101101110101000010101011111111000010100110111111110001001100110000011100011010010110111001111000101111111010010110100001110100100110101001000011000101000111010100000101110000101111000111000001100000011011111100000010110100000100101110010010110001111111001001011000110100010101101001001010000100101011110110010001010010010000010010000111010010110010111101011001010011010001011111 0001010101111011001010011010101000001000111000100110110010000000011110110000001110101100101100111000001001100011010001000011111110011110111010011011000001010011010100000110001101001100011001010010100101110100101001000000100100110100111111111011001010101001110010101001010001110010100011001001101101010110111010101000000100110000010001001101110001101100110110001000101000110101101000000000111011110100 1010101101000100011110100100000001100011100011100111000101010010110100110001111101111010101001100011100110101001100111010110110010110011010001001001100011000100100100100101001111101011010001101111011011110001010100010011001011011100111011001001110100110000101100111010111110001100000000011111010011111000110001100000100110111000110000101110111101110101110110010010011001110001111100011110001101111101 1100111111110000000010111110001110101001101101010111000110100110101011101110111110011100101000111011100011011001011100010001100110001111011101111100001111000010010111010110010100010110101001001100010110100011011111001011010111100010001101110000000011001111110101000111001010111101010101100100101000111011010000000101011000010101011100011101100110011010001111101101111011011000000011011110001000001111 0011000011101100111001101100011011000111101000100011100001001100010101001011100100011010011100000111010111100110100011110000101100111010001010000100110000001100100101101001011100101000101101001001001100010111000110000001011100110000101011000010000011001000100011101100011011100101110101101110100010100010001101001100100100111111111000001111001111000110110000101010000100011010010101000000000110110101 0100011010000111011111111100100011110101110100011011000110100010000101001010010010000110000110100100011101101000111001001010001101010010000011011001101011010001110000100111011100010000001000111000010010110110100100111111100111100010111000010010110001111110101111111011011100101000110100100100110110100001000000000111111000010110011010001011111101100000110101110101001111010010000010101111001101010011 1100011111001010010000000100010110111101001010111100110001000000011010000000001101001111100100111111001000100101000001000110100010101101101010000001011000011111010011001110011110001001010100101100001111000001010110110111111101100100000101010110000100011011111100100010000101101001011101011101111111010100100010111010011010010111011011010010101001000011111010010000011101000011101100110010110111001101 1111000011111000100010101000111001101011000110101110100011100111110111111101011011010000010011111000110101000000011010010010110010001000001100111111100101110000010111010111011111110010001110100001100001101100000100011111100010100011000101101001101110111100011111010001111111100100000001100011100001100100010110011111010000000111000001001000101011010011101101111000001110100000000011111000011100000101 0010110011100110011100001010111101110001011001000010111011111010000011000010010110000101001101010100010111000010011010110100101001010110000100000111000100000001110111011010111101101101011101000100100000110111000001100101011111111010110100000101010100110011110001101000110111110110010010100101110110000111101100001010110001101000011011000100100101100111010110100111101001010000001101110110000100001101 1000000011011111111111101001010001101010100100110101010011101100001100100110111001001100110110110100100001011110010101100000101010001011000001011110110000011000101100111101101010100011101100011001111111110110010001001010110101100101110111100100001110010110000011101000001001001101101100110101111010011010111011000010010000110110000000001001111111011001000000110010000101110100010011000100010001111111 1011011001100000000100110111001011010100001100100010111000000011101010001100100111111110011111011100001000010110011100110101000101000011101100001110010011001101001010011110011111100111010101011010101111010001011001110001001000110000011010110010000001100000101110001110001000000101111001100000100101100001010000010110011010110110001001111000100011011001000010101101100101001001100100111001011110110110 1111000010000011101101001000110101111000000110101111110110000001100000101010111101100100110010101110110101110100000101010111011100111111011011100100001001001010001101111001111111101100011100000011011101001111100000011100000011010000000110100111011110000010001011111101111011110001111010011011010011101100010011000101101110011000010111000111100111000000000000011010011001001000100101100101100011000011 1101011010100001010101011010110100111110001111001000100100010010100100101010010110111001111111000100011101100101011011011000110000000001011111101100001100001000110001000010111000100011001101101011110011111000101100010101010000000111010101110001011110010101011000010000001100111010101000101110100111001000000000001000111000011110100001111000001000011111011000100111100001111110010100001010010110100010 1100101101011101011011000110010010111100011101001010100111100110001001001100110100110001001110010000010101101000011011100101011001011100101001001001111110100010100010001111100010100010010011011010011000011011010011000100011010110000100101110111011010010110011010001011100111010000111001010011100101011010111100101000011111100000111011000111010101001001111111101000011000110011100100101011100000001101 0111101110001001001011011111101101011011011010011010011111111010101101111010111011110001100100101001110010001110000101111100111110101001000111111001101101001000001111100111000110010010011000011100111100011100000010001111110010001010000001001011001110101100010011111101001101101111001100111100000110000100000101010101101011011100100011001010100011000010101100110100110110011010000111001101000111010100 0111111000011001100001010011101010111001111011110001110000110111011101000101111000001010001101100010011010110111100110100001110001010001001111101110100001110010001000011101110100111001010000110000101000110010010000100010111100010110000000011000101110111101000101010011000111001010000111011101101101010111100101011001010100111010100101110001000111011001100111101001001000111110010010111001011101101100 0110010000011011110101010111001011100011001010100100101110101101110101110111110111011111110100101101110111111011000100100000101010110110001111000111000011011010000101000100010111101100100100001001110110110110111110010001110000110001101110111110100001100001110110101111011010111010011110011010010111110001000001010010111011000001001001110110001001001001010000011111110010111100110001110110100110000110 0111101001111011010100110001000011010010010010001110011010110110100111000110100110000111110000111111010000111111101110111111111101000111000110111010010000111011010111001011011110011001110000000010001101001001111111001001110111011111010110011010100110110100001111000111000110010100011011100100010001000101111011111110010010000001100111101011001101011110011111101001111001100011100100000010110000001100 1110010111010111110001001110100101111101110011010000011011111101111001001101010001101100101000101100010011011000001110001010100110001100100110110011100010100101110110010110100011111100000101101011100001111111100111110001111111110011001001010001101111100010001001001010111101101111001000111011010111000100101010001111100100000111010100001110101010011110001110101001000011101011000101111111101000110111 0101100111111011110001100000110110000100010110111010100000001101100101010010100011011000100000011000001110100011111110001000101101110000000001000101010101111110011111001000101001011100011101011000100111011011000011000100010100101000100101011001010110001101111000011101101110101111111110010100000101101111010110101110111011000001111101001101110101110001001111110000110010000001011011101100001001101001 1101001101110010100000011010101111101111001111010000101111011111011100110000101111100000100110110111011101100101011001100100011110111100100111110100110001100000000011011101111010100001100011100101000100100001101101101000111110010011010110001100000100010011001100011011111111110011000011011100100100111100100101011011111010101001110001100011011011000110100110111111100100011100001100010000000011001110 1000011101100001010111111010101101010100101011100110100001110100101110001101010000000000110011111011111000111001001110010000110010101111001100011111001101101010011110011010000101110010000110010101101110010010011010111001000100001010100101011101100000110100101101001111101011110000111001101111101000101000110011000101010000000001100010101001111000111000001000010001011110001100011100000100111100000010 0111010101101101111001010011101101010101110100110111100011001011001101100100001001100000000100101101101001000000101110111101000001000010011000101001111001000000010001100000011000100111110110000010011111101001011010100100010001111111111101011011110100110111110100010011011100111110111010000110100110110000000111111111001010111101100100100110000101011010110101010111100100001000011001110101110110010011 0101010000100010001100001110100111010100001000100011101111011001000011000110000000111011110010110000100110110011110111101110010110110010111011011000100010111010011001000001101010010010101110000101101000010000111010101011011000010111100000000001100010011101000100111001000001010000011010001111001011000100111000111101110000100111001100101010010010111001010111000001011010101110110100001011101001000101 0111011101010010001111010011010100110011101111000010110100101110111001101101001011001001001011101001100010001100010111111000000111000011100001110010100111100010001001101011110011001011000100011110101000000010000011110011011001011000010000100101011110010101010110010101010010100000001011101101110101011001000000001111100110111010110001000000001010001001001011110010001110000000100111000111101100000110 1010001011100101011000010000011101101110010011111010111010111001101010111000010001111011110011110001101000001011110100101011010001010010100100110001111010110000111000011000000011011101000001100110100000000001100110010000001101111010111100101100000111010000100001100110100100111101000111001101101110111100111000001010111111010110111000111011000011001110011100101000000010011110101100111001110101001110 1100100111011010101001011101111010000111101110111110110011111100010011100011010000000010000010010101001000011000011010110101010111100101101111011001101000111100001000111000010111111001010000101011000101100101010000101001101000000110100101011001001100001000000001010111000100000010011001010110110011001100000001101011101011000011101000110111111001010101000010100010011100000110011010111000000110101111 0001001001111001000011101110111110111101100000010001000111011001010111001110101110000101001010100010100001101110011010011010010001111101010000011001100101000111111110110000101000110011110100001110101110111101101000101100110000011101010011010001111010111001111110101010101010001100110110101011100110110010010010011100111011101011101100010011010011110000100100001110111101101000100011111101101111100101 0001000111111001000000110110010000010111001000011111100100111111111010010100011001110000011001000101110100100100001000000111011101110000010000010110101010111001011110100001010110110101000000001111110110111001110000101011011111000000110101101001110111001111010111111001001011101100011110011000001100001001011001101100001011010100111111101000001110000110110111001111100011110100100111011111011001010101 0101100010011000000110001110110101000001011100101000010000000101001111010100010010001000000111011000100011010100010111011111001110010111011000100000010001001000010110001011110101010001100011111100000001011101011101101101110000000110001110101101001000000111011100110101010000101101010110010110010011000001101001110100101001001110101011101000011010010111110111111100001101101000110011011000100111000000 1110110100111100100111001011110101100100101101010000000101001011111110010101011110110101001110110100100011011111110011010101010101100101011110111100100110000000111101101110111100001000001000001101001010111111001000100001000010101011101001111011001010000001110000111110111100000101010111010001100010101100100011111111111111100101101110111110011101110000111010100000111010100000011111000100000011010100 1111100001110111001101010010011100110001101001000000000000101101001000110111101111001101011111011011101001101010001100111111111000010001001010000110111110110001011000100100100100000000111110100000010000110000001000111011110000110010101001111110101101110101011111000011001110100110100010110001100000110011001101111110100101110110101111101101111001100100100100110001100000101100101111000111100100111111 1101010011001010000011000110001101011111111011010001100000111110000010000100000110011000010000100010111101011101011011011001011100010001011101000111111100101011001011010010000011000011000111001011010010011010010110000011111001110010110000100110111001000111000100001101101100010100010111011101010001111010010000010101001011110101000110101111110101100001100100011101101111010111010100001010101010110010 0000010011001101000011100011010010110010000000110111110001110110100000010011110110111001010100011010000101001011110100000111101101110111101110101000001100110010100110011110011101001111111000010000001010010111101101011111101100111000011110010011101001010001011000011001010010101001001011110001011010110010001101110000010010101110011011111100000001111010001000111101011101001001010110011011000110011001 0101110000100001010101011000100100011011010110000010010000001110011110111100100011111111110010111000101010001101000100110110100111000011110110111001111000011111111100010011101001010001001001001110100010111110111101100100100000101010101011011010100111101011001100000010101110101111011011110111111001110111101111001100001001010111011110111000000010000100000111011110101101010110000111000111010101010010 1110000100011111000001110110010111001011010100011101011101110110110101111110001010110001101101011000101011110101100101010011100010011100100111100111111100111101000100001100111111001100110101000001010001101011111111110000011001100010110001001100110111001001011010010010011000111101001001101111100001010011001101000001011111011001110011010100000100001010101110110111110111111100011100110000111111001000 1001101001000000001000111001011101110100001101000001010010100001100000000101111100010011000010001101010110010001000100100100010001001000111101011110110001010111110010101101001010100000101101111000100110000000010000010000000111000111101100000001101001100101001000011000001101100010111010111000100100110100010011101001111000000000110010000001010111001100000001010111010110111010100010001110111001101110 1010100101010001100101000011100001001001100100101111100100101100011100001001001110010010101001100100111011000110111010110011000011111011111001001001100001110111001111000100100011010000110111110001101011100010101101110111101000100101010010110011000101110111111001100100110101101011011101001001101111010011001010110111010000101100111100001010001011101111011000111011011011100001100011001111111101110111 0010011011110100101000010101101100101000011111111101001011011110101011011110101101111000100010011010010110000010011001000110100000001101100000000100111011101000000000010110001001011100110100100010001010110001101111001100001011100001000010011000111011011001010010110001100011111000010000011111010111101100000111100000100111100001000001010101111001001000000111000111010010111010100111101010101100111010 1101101000011101001111000101111001000010101000110010101001110000001000001011010011101110000100010010011101101001110011101110110000010100001010111101001100000100001111111100001101110011101010100111010100111111010011010010010110101111001011010111110101111111011011100011000010101000111011011100110010100010101110110001010000010001010011100001111001110111111011000111000000001110010010111100110000011001 0001100111110110100110101000100111000011011000011010101010100101101000110111011011110110000011001001100000111111001101100111101011101000001001010100001101011101000010100000001000000000111000100100111011001001011010110101000010110110001000010101100100101011110111000100101001010010111101101110011011111001001111000100000010000101110000100011100110001000111001110110101000111101011011101110011111101100 0101010111001001111000001010100010110011011111110010110001110101111001011110001010101010001111100000000000001010100100001010011101100110111100011101101111101000110110000010111111100101011001110110000001111110000011101000001010001100111110111000110111101111001101001010001001111101010001101000000011001100010001111111110111111001100011011011000111100000110111111110001010111111111101001000000010110001 1000110101111011100000111111000100011111111101101111011000011001101001110101000010101001011010011010100000101000001011011111001000001101000110011010011011000111110001011010110010010111101110001010111110100101001110011000000101101101011101010101000100001001101011010110100110110101011010100001100010100000000111100111100000010101000010101010010000010111010111000100011111000001101101011001001101111111 0011000110110010100100010000111111011000000011101000100011101101100000001100101110011110101001011101011001001010101010011001100001000010001101111111000110110011111010000010011011101100001001110010000110111011001110000010101101111011101001101000000100000101000001110011001011110000101111110100010010011101110111011010001101010101101001001001000101101010001010101010011000101011101011000100011111101111 1001100001010010101110110100100111111101101010111111010111100100110001101101011100000100001110100100000111100101001101111110000001100011001100011100100101100001100110101010110101001010110011000101000000111111010110010110111001111100100010101111100110100111100000110001000011110101101100110010000000001100100011001111010101110111000111000000100100001111001111000010101110111000011101001011010000010111 1011011001101001100011010001110111011001100100011000100000011110100101100110001000010001110110100101111011010000100110101010010000100001001100001011011101100001110011000001101001100011011011010110000101110100100101110000000101111011011100011001101110100101100001100111001110100001110111101010101010010001101110001001110101101110110001100110110101000111000011100111000000111101001011100011001110011011 1100000001001101101000000111000011000000010001100100011111001110100110010011000101100011100001110100000110010111001001111000100011011001001110001100010101110011001001100100000000101001011111011101010011110000001101011000111110101010101000110000011100001000101000001010011101111011001000100000110111010001000010011101011110000011010111111111010011110101110010101111001000110001011001010000010100010010 0001000110000000001001001001001100001011001010001100110011101111110001111110010110010011000111010000101000010001001010100111001111001110001001101110000100111010111000101011011011001000100000011101110011101000011001110110011111100010000001011110000111111101101100110010001110011011100101011110110100101011110001001101001111111010100101001110100000110011010000100110111111101010011110011010001101000000 0101011000000111101000100010001010110101101101000110010100110000001101000110000100110101110011011010101100010110001001001110011001101100010111001011110101010111100100001100000010000100011011000000110011011101010011100000000011100110001111001110000001111000111001001110110110010110001100110001000001110010011110011000111011101110001001011000010010100101011111111010100111101010010001111111010010001001 1001010100000111011111000100000010110111011000000011011010100010110001111010100001111011010101111000111011011101000010100101101101100100110011111010100010111001101010101111011010100011111101001111101001110010001101000010111001000010000111011000001000101101110011100000101011010001000101011110010111111111100111100100110011100000001101011010000101110111011100010000011001010100101110000100000110001001 1111100010110110110000101110010101100000111001101001100111101101001010110100001100010110010010001101010101110011000011100000001001001010001001011000000111011101001010110001111011100101101010111001101101111101000001000110111010110110110101000010100100011011101111010010011010001001011101100000011000001001101011100100111010001010010011011101101001001011001010000100111111010001101110111101001110011010 0011011100010110110001011101110000101101001110001001110011101110010111100111101011111111001001100011011001010001000100000000000011011100111110011000111110001100010010010111001001001101100110111011110100000000001111000101000000101110001101101110000010101000000100111000100001000110111001011010110011001011101011110101001010111011111001110011111001010010010000011011101011110011000011010111111010100111 1111000101010111001111110010001000010010110010100111101001011110011000100011110010100100001100011101000111111011010010101010110010010110011101000010110001101111101111000110000101110011110101000110001100001000101000000010110010101101100000011100101010000100100111010100010101110000010111011010110110111000110001111110110010111111111001110100110010100111111101011110000011000101101001001111101000101000 1010000010010110111100100110100110101101101100101001110011001011000101011010011010001100001011000111110001000110011110000000000000111110110000100101100001000111001101001101011011001000100000000101010100100010111101110100010010001100001011111101111111001110100110010110101100111110010000100011111101100101001111101001111011111110001111010101101000111011011011100100001000111000111011011110100101110110 0000001001001101100010000001000111000110011111100111111110110100111000000111111011000001000110101010001110010101100010100000100011111111011010100010010111101001101001011110011001000110101101001101110101111000101011110111001101101101100111100101010011001110000001000001001101110100111010101010101000100111000101111001110001001101100011100010000101000000110001011101111111001110110101110010000101011001 0110000011001001100100011011110110100101100011000100111010100111111111010100010111010110000111101100110000011010111010100110111111001110010110111001110000100100010111101100110010011011101101001011111010101111011010111010000100000011110011111111100111000000011110011111101101110110011100011011001100110010000000011100110000111010010100001101100010100100110010000010011001100101110111001100100101110111 0011000010100011010111100110011000111110010111111110000111010100110111001011011111010010101001110110100010001011100110011011011110111010100000110111110011010100110001011011000010111010101100111100101111100111011101111001100111110010110101010100100100011111000110010011110010100110010010001001100110011100000110111000100111011110110100011001111011001110110101010111000110111111010101110110100110111101
cTrader Algo

【cAlgo】サインツールを作る【SampleCode】

5/1/2021

5年以上前の記事です。内容が古くなっている可能性があります。

サインツールを手軽に作りたい

サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター

もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。

今回はcTraderでこんなのを作ってみましょうというお話です。

 

単純なサインの出し方

例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。

SimpleMovingAverage _sma;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。

でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。

おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。

であれば、バー更新時だけ条件判定しましょうか。

SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
    Bars.Tick += _=> {
        if(_lastTime != Bars.LastBar.OpenTime) {
            OnBar();
            _lastTime = Bars.LastBar.OpenTime;
        }
    };
}
private void OnBar() {
    var index = Bars.Count - 2;
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)

とりあえずこれで更新時だけサイン判定ができるようになりました。

しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。

ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。

 

いろいろ考えると結構面倒

ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。

というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。

これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。

 

SignToolsTemplete

主な機能

・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。

・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)

アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。

・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)

 

ダウンロード

こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。

Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。

 

使い方

ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。

仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ

 

①判定用メソッドを作成

まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。

ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。

//-------------------------------------------------------------------
//  サイン判定メソッドはこんな感じで用意
//     必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {

    // --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
    if (index < 1) return null;
    if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
        return TradeType.Sell;
    } else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
        return TradeType.Buy;
    } else {
        return null;
    }
}

自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。

買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。

 

②Initialize内でオブジェクトを作成し、各種設定

Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。

以下はすべてInitializeメソッド内に記述します。

// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);

設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。

// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;

また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。

// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;

// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";

// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;

アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。

 

その他

サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。

また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)

 

SignIndicatorクラス詳細

細かい設定したい人用に。

プロパティ
(ChartIconType) BuyIcon { get; set; }

買いサインのアイコンを設定します。

(ChartIconType) SellIcon { get; set; }

売りサインのアイコンを設定します。

(Color) BuyColor { get; set; }

買いサインの色を設定します。

(Color) SellColor { get; set; }

売りサインの色を設定します。

(double) DrawMargin { get; set; }

サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。

(int) JumpMargin { get; set; }

◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。

(WhenAlert) WhenAlert { get; set; }

アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。

(string) SoundFile {get; set;}

アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します

(Color) AlertColor {get; set;}

アラート時にチャート色を変える場合の色を設定します。

(WrapPanel) ButtonPanel

ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。

 

メソッド

パブリックメソッドはありません。コンストラクタが一つあるのみです。

SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])

1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます

2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。

3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori